在.jar文件中读取图像时程序崩溃

时间:2014-05-13 19:53:59

标签: java image jar

好的,所以我有一个程序,你可以上传房子的图像出租,然后将图像复制到所有图像所在的目录。然后在另一个窗口中,它将所有图像加载到我可以单击的演示文稿中。在编译和运行Sublime Text时,这非常正常。但是在创建.jar文件并运行它之后,存在一些问题。我可以上传一个图像并将其复制到图像目录中,但当我转到另一个JFrame窗口时,应该显示所有图像,它会锁定程序并且必须通过任务管理器关闭。有什么建议?

这是启动程序时的代码,其中一些房屋的库存图像被加载到主图像目录中,用于所有房屋图像:

public void copyStockImages(String filename)
{

    String filepath = "Images/Testimages/" + filename;
    BufferedImage image = null;

    try {
        image = ImageIO.read(getClass().getResource(filepath));
    }
    catch( FileNotFoundException fnfe ){
        System.out.println( "File not found: " + filepath );
    }
    catch( IOException ioe ){
        System.out.println( "Error reading image" );
    }

    String newFilePath = "Images/houseImages/" + filename;
    File fileOut = new File( newFilePath );
    if( fileOut.exists() ){ 
        return;
    }
    try{
        ImageIO.write( image, "jpg", fileOut );
    }
    catch( IOException ioe ){
        System.out.println( "Error reading image" );
    }
}

上传图片:

private void uploadImages(HouseForRent house) {

    if(filepaths.isEmpty()) {
        return;
    }

    Iterator<String> iter = filepaths.iterator();

    while( iter.hasNext() ) {

        String filepath = i.next();
        String filetype = findFiletype( filepath );

        BufferedImage image = null;

        try {
            image = ImageIO.read( new File( filepath ) );
        }

        catch( FileNotFoundException fnfe ) {
            dialog( "Cannon find file: " + filepath );
        }

        catch( IOException ioe ) {
            dialog( "Error reading file" );
        }

        catch(NullPointerException npe) {
         }

        try {
            saveImage( image, filetype, house );
        }

        catch( IOException ioe ) {
            dialog( "Error reading from file: " + ioe.toString() );
        }

        catch( NullPointerException npe ) {
            dialog( "Error: " + npe.toString() );
        }
    }
}

将图像复制到目录:

private void saveImage( BufferedImage image, String filetype, HouseForRent house ) throws IOException{

    String newFilePath = "Images/houseImages/";


    String filelink = newFilepath + filetype;

    File fileOut = new File( filelink );

    if( fileOut.exists() ) {

        house.addImage(filelink);
        return;
    }

    try {
        ImageIO.write( image, "jpg", fileOut );

    }
    catch( Exception e ) {

        dialog( "Error reading image" );
    }

    house.addImage(filelink);

    imageLinks.add( filelink );

}

然后我有这个很长的Image类,我在PasteBin上发布了代码:

http://pastebin.com/yjzZdVTC

2 个答案:

答案 0 :(得分:2)

1)我怀疑这是你问题的根源:getClass().getResource(filepath)

从IDE(如Eclipse)执行时,

String filepath = "Images/Testimages/" + filename;将成为硬盘驱动器上的路径。但是,当您从.jar执行时,它将尝试在.jar文件中打开文件

2)catch( IOException ioe ) { dialog( "Error reading file" );是次优的&#34;。保留至少错误消息(ioe.getMessage())总是一个好主意。如果不在您的用户对话框中,那么可能在某个日志中。

3)catch(NullPointerException npe) { }非常糟糕的主意。你真的不应该像这样压制NullPointerException。一般来说,你应该处理它。

... IMHO

答案 1 :(得分:0)

如果您没有抛出任何异常,并且您的应用程序涉及使用Swing的GUI,则可能是因为并发。

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

阅读本文。