В моей программе я сделал утверждение - которое оценивается как ложное - из исполняемого, но никогда не видел вывода консоли об утверждении. Я хочу знать, ложны ли мои утверждения, но кажется, что runnable перехватывает все брошенные утверждения?
Ниже приведен простейший пример программы, которую я мог бы написать для демонстрации. (Утверждения включены. В противном случае программа вела бы себя иначе и печатала бы обе строки, а не только одну). Вывод программы.
Собирается утверждать ложь
Вот и все. После этого оператор assert бросает и что-то ловит, и я никогда не узнаю об этом. Я хочу знать об этом, что я делаю не так?
import java.nio.ByteBuffer;
import java.util.concurrent.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.FlowLayout;
import javax.swing.*;
class App
{
private static final ScheduledExecutorService sExecutor =
Executors.newSingleThreadScheduledExecutor();
// Main
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() { createAndShowGUI(); } });
}
// Swing GUI
private static void createAndShowGUI()
{
// Just create a swing thing. Boring
JFrame frame = new JFrame("Title String");
JLabel label = new JLabel("Hello World");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(label);
frame.getContentPane().setLayout(new FlowLayout());
frame.pack();
frame.setVisible(true);
// ********************************************
// INTERESTING CODE HERE. We schedule a runnable which assert's false
// but we never see a console assert error!
// ********************************************
sExecutor.schedule(new Runnable()
{ @Override public void run() { doAssertFalse(); }}, 0, TimeUnit.SECONDS);
}
public static void doAssertFalse()
{
System.out.println("About to assert False");
assert false;
System.out.println("Done asserting False");
}
}
UncaughtExceptionHandler
, связанным с вашим потоком. Вы пробовали установить собственный, чтобы увидеть, можно ли увидеть, как проходит исключение утверждения? - person Laf   schedule 15.01.2013Thread
, не предоставляя вам к ним доступа (afaik), и вам нужно поставитьUncaughtExceptionHandler
на экземплярThread
. - person Daniel Kaplan   schedule 16.01.2013Thread
- этоRunnable
, поэтому вы можете создать свою собственную реализациюThread
со своим кодом и связать пользовательскийUncaughtExceptionHandler
с этим потоком, а затем использовать его как параметр при вызове исполнителя. Не знаю, будет ли это иметь значение. В любом случае, вы дали ответ, который, вероятно, более эффективен, чем мое предложение. - person Laf   schedule 16.01.2013