Exceção de ponteiro nulo ao usar a API do compilador Java
-
23-09-2019 - |
Pergunta
MinhaClasse.java:
package test;
public class MyClass {
public void myMethod(){
System.out.println("My Method Called");
}
}
Listagem de SimpleCompileTest.java que compila o arquivo MyClass.java.
SimpleCompileTest.java:
package test;
import javax.tools.*;
public class SimpleCompileTest {
public static void main(String[] args) {
String fileToCompile = "test" + java.io.File.separator +"MyClass.java";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
if(compilationResult == 0){
System.out.println("Compilation is successful");
}else{
System.out.println("Compilation Failed");
}
}
}
Estou executando a classe SimpleCompileTest e obtendo um NullPointerException.O ToolProvider.getSystemJavaCompiler() está retornando nulo.Alguém pode me dizer o que há de errado com o código
Solução
Eu suspeito que você está se deparando este problema - executando o código com um JRE em vez de um JDK.
Quando você corre SimpleCompileTest
, tentar explicitamente especificando a versão do java.exe que você está usando como aquela em seu diretório JDK.
Outras dicas
Eu recebi o mesmo erro. Talvez eu esteja tarde demais para responder a essa pergunta, mas compartilho minhas próprias experiências, isso pode ajudar alguém a enfrentar o mesmo problema no futuro. Eu estava brincando com o código -fonte em Compilar arquivos Java em tempo de execução.
eu estava conseguindo java.lang.NullPointerException
como é mencionado. Imprimi o diretório inicial do Java com System.out.println(System.getProperty("java.home"));
, e notei que meu eclipse estava apontando para "C:\Program Files\Java\jre7
"Mesmo depois de mudar minhas preferências para usar o JDK1.7 em vez de JRE1.7.
Encontrei uma solução alternativa forçando o uso do JDK1.7 definindo a propriedade do sistema como esta:
System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_02");
Então eu compilei meu programa e não recebi nenhum NullPointerException
.
Provavelmente você tem um JRE em vez de JDK instalado. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477844
Eu estava tendo o mesmo problema
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
estava retornando nulo. Mesmo depois de usar
System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.8.0_31");
estava retornando nulo.
No entanto, a questão era simples, pois este código está no Tools.jar
encontrado em Java\jdk1.8.0_31\lib
Se você estiver usando o JDK. O que eu fiz foi ir para project-->properties-->Java Build Path-->order and export-->
e movido tool.jar
ao topo de outros JRE e projetos. Isso me ajudou a me livrar de NULL, espero que isso também ajude. Feliz compilação ... :-)
Seu trabalho com o aplicativo Java, incluindo as ferramentas. Jogando nullpointer
Suplemento: A resposta acima é definir a propriedade Java.Home System dentro do programa. Isso também funciona para mim, mas não é uma solução muito geral, pois você é codificado para uma versão JDK. A alternativa que estou usando agora é dar o caminho completo para "Java" na linha de comando quando executar o programa. Como (consistente com exemplos acima):
C:\\Program Files\Java\jdk1.7.0_02\jre\bin\java -cp ..\classes path.to.program.myProgram
Dar o caminho completo para a versão JDK significa que essa é a versão que está executando o programa, então esse é o que será buscado com o ToXProvider.getSystemjavacompiler ();