java: cannot find symbol. Как решить проблему?

199
01 ноября 2018, 07:40

Почему переменные width и height не передаются в BufferedImage? Компилятор ругается на 15-ю строчку.

1     static File img = null;
2     static BufferedImage image = null;
3    public static void stegWrite(String filename){
4            img = new File(filename);
5            BufferedImage imgch = null;
6            try{
7                imgch = ImageIO.read(new File(filename));
8                int width = imgch.getWidth(); //Width of the image
9                int height = imgch.getHeight(); //Height of the image
10            }catch(Exception e){
11                imgch = null;
12            }
13           long size = img.length(); //Size of the image
14            try{
15                image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
16              image = ImageIO.read(img);
17                System.out.println("Reading complete.");
18            }catch(IOException e){
19                System.out.println("Error: "+e);
20            }
21        }

Полный код ошибки -- https://sun9-7.userapi.com/c831308/v831308826/178550/guX8nDn5dPo.jpg

Answer 1

Переменная объявленная внутри try/catch никогда не будут доступна вне конструкции. Читайте про область видимости локальных переменных.

Так будет правильнее:

static File img = null;
static BufferedImage image = null;
public static void stegWrite(String filename)
{
    img = new File(filename);
    BufferedImage imgch = null;
    int width = 0;
    int height = 0;
    try
    {
        imgch = ImageIO.read(new File(filename));
        width = imgch.getWidth(); // Width of the image
        height = imgch.getHeight(); // Height of the image
    }
    catch (Exception e)
    {
        imgch = null;
    }
    long size = img.length(); // Size of the image
    try
    {
        image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        image = ImageIO.read(img);
        System.out.println("Reading complete.");
    }
    catch (IOException e)
    {
        System.out.println("Error: " + e);
    }
}

P.S. На мой взгляд Eclipse более информативна (из коробки) на всякого рода ошибки в отличии от Intellij IDEA. Из-за этого у вас и возникла проблема. Eclipse сразу подсветила ошибку с инициализацией переменных.

READ ALSO
Подключение к Postgre на удаленном хосте

Подключение к Postgre на удаленном хосте

Я новичок в вопросах работы с БД с внешней стороныНаписал код на Java, с помощью которого пытаюсь установить соединение с базой на хостинге...

201
Почему нужно указывать объект в блоке synchronised?

Почему нужно указывать объект в блоке synchronised?

Почему нужно указывать объект? Ведь мы можем вообще не использовать этот объект в блоке

182
Что значит аннотация @HotSpotIntrinsicCandidate?

Что значит аннотация @HotSpotIntrinsicCandidate?

Смотрел JVM, наткнулся на аннотацию @HotSpotIntrinsicCandidate, довольно часто ее стал встречатьЧто она значит? Раньше ее не было

178
Настройка конфигурации Hibernate в Spring

Настройка конфигурации Hibernate в Spring

Использую версии Spring 50

195