LINUX.ORG.RU

java, try-resourses block demo -> unreportedException java.io.IOException

 


0

1

Привет,

в чём может быть ошибка?

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
    public static void main(String...args) {
        TryResoursesDemo.copyFile("fileFrom", "fileTo");
    }
}

class TryResoursesDemo {
    public static void copyFile(String fileFrom, String fileTo) throws IOException {
        try (FileInputStream fin = new FileInputStream(fileFrom);
             FileOutputStream fout  = new FileOutputStream(fileTo);
        ) {
            int ch;
            while ((ch = fin.read()) != -1) {
                fout.write(ch);
            }
            System.out.println("file has been copyied.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Error:(7, 34) java: unreported exception java.io.IOException; must be caught or declared to be thrown

Ты либо крестик сними либо трусы одень...

Тьфу! Ты либо убери из объявления метода copyFile trows либо лови его в main. Ну еще его можно прокинуть из main. Правда зачем, если оно за пределы try/catch блока не вылетает.

P.S.: Apache Commons IO уже умеет копировать файлы.

TheKnight ★★★
()

в чём может быть ошибка?

В твоём незнании языка. Проверяемых исключений в частности. И try-with-resources тут не при чём.

korvin_ ★★★★★
()
Ответ на: комментарий от TheKnight

Apache Commons IO уже умеет копировать файлы.

К чёрту ненужные сторонние зависимости, когда есть стандартный java.nio.file.Files

korvin_ ★★★★★
()

?????

Вы в каком редакторе набираете?

Eclipse предложит

public static void main(String... args) throws IOException

либо try...catch.

И сам код дополнит.

И доведет Ваши знания Джавы до автоматизма.

Только зачем Вы делаете двойную работу и пишите индусский код с выбросом еще заведомо «мертвого» IOException ???

----

За Apache Commons IO - плюсую.

Зачем изобретать велосипед?

Bioreactor ★★★★★
()
Последнее исправление: Bioreactor (всего исправлений: 3)
Ответ на: комментарий от Bioreactor

Благодарю за ответ. Просто в main нужно было добавить throw ioexception, а catch в конце не нужен, да.

P.S. шикарный у вас ник.

misanthropy
() автор топика
Ответ на: комментарий от misanthropy

Вым вообще не нужен выброс в методе

public static void copyFile(String fileFrom, String fileTo)

У Вас же есть обрамление try...catch checked исключения в методе.

Bioreactor ★★★★★
()
Ответ на: комментарий от misanthropy
$ cat Main.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
    public static void main(String...args) {
        TryResoursesDemo.copyFile(args[0], args[1]);
    }
}

class TryResoursesDemo {
    public static void copyFile(String fileFrom, String fileTo) {
        try (FileInputStream fin = new FileInputStream(fileFrom);
             FileOutputStream fout  = new FileOutputStream(fileTo);
        ) {
            int ch;
            while ((ch = fin.read()) != -1) {
                fout.write(ch);
            }
            System.out.println("file has been copyied.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

$ javac Main.java

$ java Main Main.java Main.txt
file has been copied.

$ 

FileNotFoundException - наследник IOException - checked.

Можете еще «ловить» в конструкторах

SecurityException - наследник RuntimeException - unchecked.

Bioreactor ★★★★★
()
Последнее исправление: Bioreactor (всего исправлений: 1)
Ответ на: комментарий от Bioreactor
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String...args) throws IOException {
        Demo.tryResoursesDemo("one", "two");
    }

    public static void tryResoursesDemo(String fileFrom, String fileTo) {
        try (FileInputStream fin = new FileInputStream(fileFrom);
             FileOutputStream fout = new FileOutputStream(fileTo);
        ){
            int ch;
            while( (ch = fin.read()) != -1) {
                fout.write(ch);
            }
            System.out.println("copyied");
        }
    }
}

выбивает ошибки

Demo.java:11: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
        try (FileInputStream fin = new FileInputStream(fileFrom);
                                   ^
Demo.java:12: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
             FileOutputStream fout = new FileOutputStream(fileTo);
                                     ^
Demo.java:11: error: unreported exception IOException; must be caught or declared to be thrown
        try (FileInputStream fin = new FileInputStream(fileFrom);
                             ^
  exception thrown from implicit call to close() on resource variable 'fin'
Demo.java:12: error: unreported exception IOException; must be caught or declared to be thrown
             FileOutputStream fout = new FileOutputStream(fileTo);
                              ^
  exception thrown from implicit call to close() on resource variable 'fout'
Demo.java:15: error: unreported exception IOException; must be caught or declared to be thrown
            while( (ch = fin.read()) != -1) {
                                 ^
Demo.java:16: error: unreported exception IOException; must be caught or declared to be thrown
                fout.write(ch);
                          ^
6 errors

Т.е. проброс в copyFile нужен.

misanthropy
() автор топика
Ответ на: комментарий от misanthropy

Смотрите мой код

try (FileInputStream fin = new FileInputStream(fileFrom);
             FileOutputStream fout  = new FileOutputStream(fileTo);
        ) {
            int ch;
            while ((ch = fin.read()) != -1) {
                fout.write(ch);
            }
            System.out.println("file has been copyied.");
        } catch (IOException e) {
            e.printStackTrace();
        }

catch где у Вас?

Bioreactor ★★★★★
()

Не делай так. Не делай двойную инициализацию в try-with-resources. Если надо отследить 2 штуки - пиши 2 блока.

FeyFre ★★★★
()
Ответ на: комментарий от misanthropy

FileInputStream

https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#FileIn...

SecurityException - if a security manager exists and its checkRead method denies read access to the file.

https://docs.oracle.com/javase/7/docs/api/java/lang/SecurityException.html

Вам нужно подробно ознакомиться с

https://habrahabr.ru/company/golovachcourses/blog/223821/

https://habrahabr.ru/company/golovachcourses/blog/225585/

Bioreactor ★★★★★
()
Ответ на: комментарий от misanthropy

Пожалуйста, прочитайте по ссылке.

Синтаксис указан в спеке

https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html

If an exception occurs within the try block, that exception is handled by an exception handler associated with it. To associate an exception handler with a try block, you must put a catch block after it; the next section, The catch Blocks, shows you how.

(C)

Bioreactor ★★★★★
()
Последнее исправление: Bioreactor (всего исправлений: 1)
Ответ на: комментарий от misanthropy

Если хотите по спеке

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose...

то делайте

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
    public static void main(String...args) {
        try {
           TryResoursesDemo.copyFile(args[0], args[1]);
        } catch (IOException e) {
           e.printStackTrace();
        }
    }
}

class TryResoursesDemo {
    public static void copyFile(String fileFrom, String fileTo) 
      throws IOException {
        try (FileInputStream fin = new FileInputStream(fileFrom);
             FileOutputStream fout  = new FileOutputStream(fileTo);
        ) {
            int ch;
            while ((ch = fin.read()) != -1) {
                fout.write(ch);
            }
            System.out.println("file has been copyied.");
        } 
    }
}

ЗЫ. Двойная инициализация - это, действительно, плохо.

В реальной программе сами себя запутаете.

Bioreactor ★★★★★
()
Ответ на: комментарий от misanthropy

в main нужно было добавить throw ioexception, а catch в конце не нужен, да

Это самый худший из нескольких вариантов решения данной проблемы :)

alchemist
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.