Given:1.publicclassThreads2implementsRunnable{2.3.publicvoidrun(){4.System.out.println("run.");5.thrownewRuntimeException("Problem");6.}7.publicstaticvoidmain(String[]args){8.Threadt=newThread(newThreads2());9.t.start();10.System.out.println("End of method.");11.}12.}Whichtwocanberesults?(Choosetwo.)A.java.lang.RuntimeException:ProblemB.run.java.lang.RuntimeException:ProblemC.Endofmethod.java.lang.RuntimeException:ProblemD.Endofmethod.run.java.lang.RuntimeException:ProblemE.run.java.lang.RuntimeException:ProblemEndofmethod.
Pessoal porque, quando o método run dispara a exception o main ainda exibe "End of method"? A aplicação nao era pra parar n?
Como a JVM lançou a exception antes de exibir "run"?
ViniGodoy
Quem define a ordem de execução é o sistema operacional. Por isso, pode ser que a exception seja disparada antes ou depois de “End of method.”
Quando uma exception é disparada e não tratada, ela mata a thread que a disparou, as demais threads continuam rodando.
O programa só finaliza se essa for a única thread não-daemon da aplicação.
ViniGodoy
evertonsilvagomesjava:
Outra coisa executando esse codigo varias vezes ja saiu o seguinte resultado
Exception in thread "Thread-0" java.lang.RuntimeException: Problem
at com.cast.C.run(C.java:9)
at java.lang.Thread.run(Unknown Source)
End of method.
run.
Isso não é possível. Você deve ter confundido a leitura do seu console.
O que pode ser é o seguinte. O java usa duas saídas. A System.err (que o NB imprime em vermelho) e a System.out.
O que você viu aí é só um delay na exibição de uma delas. Mas com certeza o comando do run rodou antes da exception.
Tente trocar System.out.println(“Run”); por System.err.println(“Run”) e ver se o problema se repete.
evertonsilvagomesjav
ViniGodoy:
O que pode ser é o seguinte. O java usa duas saídas. A System.err (que o NB imprime em vermelho) e a System.out.
O que você viu aí é só um delay na exibição de uma delas. Mas com certeza o comando do run rodou antes da exception.
Tente trocar System.out.println(“Run”); por System.err.println(“Run”) e ver se o problema se repete.
Pouts é verdade funcionou agora a exception não ficou com o delay, foi exibida abaixo de “run”. System.err diferencia-se de System.ou pq exibi em vermelho? So isso?
ViniGodoy
São duas saídas diferentes. Numa o processo cospe os erros, na outra o processo cospe a saída normal.
É útil, pois você pode logar o err num lugar separado do out.
No caso do netbeans, o console dele é quem pinta de vermelho e joga tudo no mesmo lugar. Quando vc roda pelo DOS, o prompt de comando joga as duas juntas. Mas há como redirecionar uma delas. Se eu não me engano basta fazer algo assim:
Esse 1> e 2> não são comandos da VM, mas do próprio prompt de comando.
Veja que a classe Process, que representa um processo externo disparado por sua aplicação java, também tem dois métodos. Um chamado getOutputStream() e outro getErrorStream(). Num desses streams sai o que foi colocado no System.out, no outro o que for colocado no System.err do processo disparado.
evertonsilvagomesjav
São duas saídas diferentes. Numa o processo cospe os erros, na outra o processo cospe a saída normal.
É útil, pois você pode logar o err num lugar separado do out.
No caso do netbeans, o console dele é quem pinta de vermelho e joga tudo no mesmo lugar. Quando vc roda pelo DOS, o prompt de comando joga as duas juntas. Mas há como redirecionar uma delas. Se eu não me engano basta fazer algo assim:
Esse 1> e 2> não são comandos da VM, mas do próprio prompt de comando.
Veja que a classe Process, que representa um processo externo disparado por sua aplicação java, também tem dois métodos. Um chamado getOutputStream() e outro getErrorStream(). Num desses streams sai o que foi colocado no System.out, no outro o que for colocado no System.err do processo disparado.