Diferença de ClassNotFoundException pra NoClassDefFoundError? :idea: :shock:
Diferença de ClassNotFoundException pra NoClassDefFoundError?
9 Respostas
ClassNOtFound -> Lançado na tentativa de carregar a class pelo nome. Ex: Class.forName(“nomedaclasse”);
NoClassDefFound -> Lançado quando a classe não está disponivel em tempo de execução
Oi,
Segue algumas explicações…
Thrown when an application tries to load in a class through its string name using:
* The forName method in class Class.
* The findSystemClass method in class ClassLoader .
* The loadClass method in class ClassLoader.
but no definition for the class with the specified name could be found.
Conforme o thiagomoraes disse: “Lançado na tentativa de carregar a class pelo nome” e o mesmo não foi encontrado.
É sempre importante, analisar a hierarquia (como estou usando essa palavra ultimamente!) de classe para entender qualquer exceção:
java.lang.Object
–> extended by java.lang.Throwable
----> extended by java.lang.Exception
--------> extended by java.lang.ClassNotFoundException
Esta classe implementa a interface Serializable.
De uma olha neste exemplo:
public class ClassForName
{
public static void main(String[] args)
{
try
{
Class.forName("TryClass");
}
catch (ClassNotFoundException ex)
{
ex.printStackTrace();
}
}
}
Neste caso, a exceção será lançada. Pois não existe a classe TryClass:
java.lang.ClassNotFoundException: TryClass
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at automation.ClassForName.main(ClassForName.java:41)
=======================================================================
Já a exceção NoClassDefFoundError possui uma hierarquia diferente:
java.lang.Object
–> extended by java.lang.Throwable
----> extended by java.lang.Error
-------> extended by java.lang.LinkageError
-------------> extended by java.lang.NoClassDefFoundError
Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.
The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.
Ou seja, a classe existe e foi compilada, porém durante o processo (tempo de execução) a classe não pode mais ser encontrada.
========================================================================
Espero ter ajudado.
Tchauzin!
Otima explicação lina:).
Hey Lina, thanks a lot for helping me out as always!
bye,
AS :lol: 8)
Oi,
Muito obrigado pessoal! Esse é o objetivo do fórum, procurar ajudar e ser ajudado. Repassando conhecimento, isso sim é importante!
Tchauzin!
poderia me ajudar a entender StackOverFlow, ExceptionInInitializationError e AssertionError? :shock:
lí a documentação mas não ví exemplos…
poderia me ajudar a entender StackOverFlow, ExceptionInInitializationError e AssertionError? :shock:lí a documentação mas não ví exemplos…
Oi,
Vamos lá…
Uma exceção StackOverflow geralmente utiliza a memória reservada aos programas, para operações de eventos de hardware. Então, provavelmente sua aplicação está consumindo/alocando memória demais.
Um AssertionError é descendente de um Error, não uma Exception:
java.lang.Object
–> extended by java.lang.Throwable
----->extended by java.lang.Error
----------->extended by java.lang.AssertionError
Procure estudar seu descendente.
Já o ExceptionInInitializationError é uma exceção de Inicialização. Só não sei um exemplo e nem como explica-la.
Tchauzin!
Hum exemplo de ExceptionInInitializationError:
static int[] meuArray;
static{
meuArray[0] = 1;
}
public static void main(String[] args){
}
O que ela quis dizer era sobre o Java Heap Space(Esqueci exatamente o nome da Exception)
A StackOverFlowError é lançado quando a Stack do programa fica muito grande.
Acontece quando voce tem uma recursividade enorme ou entao quando um metodo A chama o B e o B chama A.