2014-11-01 2 views
-1

Я написал программу для изменения размера изображения для друга, который, кажется, работает, если я скомпилирую его с помощью eclipse, он просто изменяет размеры всех изображений, в которых выполняется программа, и создает там новый каталог сохраняет новые масштабированные изображения в папке.Jar, предоставляющий null-указатель exception java-программа

Но когда я экспортировать его в Java я получаю исключения нулевого указателя линии, что указывает на

" for (File file : allSubFiles) {" 

помощь pelase

public class Sample { 

/** 
* @param args 
* @throws IOException 
*/ 
public static void main(String[] args) throws IOException { 
    // TODO Auto-generated method stub 

    String a = (Sample.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 
    File dir = new File(a+"resized"); 
    dir.mkdir(); 

    System.out.println(a); 
    File tempfile = new File(a); 
     File[] allSubFiles=tempfile.listFiles(); 

     for (File file : allSubFiles) { 
      if(file.isDirectory()) 
      { 

      } 
      else 
      { 
       String temp = file.getAbsolutePath(); 
       String substr = temp.substring(temp.length() - 3); 
       //System.out.println(substr); 
       if(substr.equals("png") || substr.equals("gif") || substr.equals("jpg") || substr.equals("bmp")) 
       { 
       //System.out.println(file.getAbsolutePath()+" is file"); 
       BufferedImage bufimage = ImageIO.read(file); 
       BufferedImage newImage = new BufferedImage(90, 90, BufferedImage.TYPE_INT_RGB); 

       Graphics g = newImage.createGraphics(); 
       g.drawImage(bufimage, 0, 0, 90, 90, null); 
       g.dispose(); 

       File outputfile = new File(a+"resized/"+file.getName()); 
       ImageIO.write(newImage, "png", outputfile); 
       } 
      } 
     } 


} 

} 
+1

Ну, что же вы отлаживаете? –

ответ

2

Так как я не могу комментировать (не хватает репутации) здесь ответ ,

Пожалуйста, попробуйте

Sample.class.getProtectionDomain().getCodeSource().getLocation().toURI().g‌​etPath() 

Если это не работает, проверьте, если TempFile указывает на правильный каталог (isDirectory()). Каков результат работы программы (System.out)? Метод listFiles() может возвращать null в некоторых случаях.

Из Javadoc для файла (javadoc):

Возвращает: Массив абстрактных путей, обозначающих файлы и каталоги в каталоге, обозначенном этим абстрактным путем. Массив будет пуст, если каталог пуст. Возвращает null, если это абстрактное имя пути не обозначает каталог, или если произошла ошибка ввода-вывода .

0

Я считаю, что это произойдет, если tempfile не является каталогом. Согласно API File, listFiles() вернет значение null, если обозначенный файл не является каталогом.

Кроме того, поскольку файл jar представляет собой сжатый пакет файлов классов и других файлов, вы можете попробовать использовать родительский элемент tmpFile. Хотя в eclipse файлы классов фактически находятся в каталоге, но в файле jar они отсутствуют. Sample.class.getProtectionDomain().getCodeSource().getLocation().getPath() может возвращать путь к файлу jar, а не директорию, в которой находится файл jar. Использование родительского файла должно быть каталогом, в котором находится jar. Также сделайте то же самое при создании нового каталога dir. Попробуйте что-то вроде этого.

public class Sample { 

/** 
* @param args 
* @throws IOException 
*/ 
public static void main(String[] args) throws IOException { 
    // TODO Auto-generated method stub 

    String a = (Sample.class.getProtectionDomain().getCodeSource().getLocation().getPath()); 
    File tempfile = new File(a).getParentFile(); 
    File dir = new File(tempFile.getPath()+"resized"); 
    dir.mkdir(); 

    System.out.println(a); 
    File[] allSubFiles=tempfile.listFiles(); 

    if(allSubFiles!=null){ 

     for (File file : allSubFiles) { 
      if(file.isDirectory()) 
      { 

      } 
      else 
      { 
       String temp = file.getAbsolutePath(); 
       String substr = temp.substring(temp.length() - 3); 
       //System.out.println(substr); 
       if(substr.equals("png") || substr.equals("gif") || substr.equals("jpg") ||   substr.equals("bmp")) 
       { 
       //System.out.println(file.getAbsolutePath()+" is file"); 
       BufferedImage bufimage = ImageIO.read(file); 
       BufferedImage newImage = new BufferedImage(90, 90, BufferedImage.TYPE_INT_RGB); 

       Graphics g = newImage.createGraphics(); 
       g.drawImage(bufimage, 0, 0, 90, 90, null); 
       g.dispose(); 

       File outputfile = new File(a+"resized/"+file.getName()); 
       ImageIO.write(newImage, "png", outputfile); 
       } 
      } 
     } 
     } 


    } 

} 
Смежные вопросы