2012-05-14 1 views
3

У меня проблема со следующим кодом. Во-первых, я новичок в Java с опытом работы с несколькими другими языками.Java выполняет «catch» блок без ошибок и как-то все еще запускает блок «try»

Когда я запускаю следующее на Android, это ошибки на «in.close();», перескакивает в блок catch и запускает Return «"; Дело в том, что функция не возвращает пустую строку, она успешно возвращает правильные json-данные, хотя отладчик говорит, что не работает return json, но что он работает return "";

public void fetch() { 

    // Get the JSON of the image gallery 
    String json = getJSON(); 

    // json somehow has the actual correct json data and not an empty string! 

}; 

private String getJSON() { 

    try { 
     // Create a URL for the desired page 
     URL url = new URL("http://imgur.com/gallery.json"); 

     // Read all the text returned by the server 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); 
     String json = in.readLine(); 
     in.close(); 
     return json; // <-- debugger doesn't break here! 
    } 
    catch(Exception e) { 
     Log.e("getJSON", e.getMessage()); 
     return ""; // <-- debugger breaks here! Cat Log shows nothing! 
    } 
} 

скопировать тот же код в консоль Java, так что я могу выводить сообщение об ошибке и посмотреть его в отладчике с изломами, а код выполняется без ошибок.

try { 
     // Create a URL for the desired page 
     URL url = new URL("http://imgur.com/gallery.json"); 

     // Read all the text returned by the server 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
     String json = in.readLine(); 
     in.close(); 
     System.out.println(json); 
} 
catch(Exception e) { 
    System.out.println(e.getMessage()); 
} 

Что именно происходит? Почему мой код работает на ошибках Android при запуске в консоли Java просто отлично? Почему при ошибках он не возвращает то, что должна возвращать ошибка. и пустую строку? Как просмотреть сообщение об ошибке в Android?

+2

У вас есть разрешение на использование Интернета в файле манифеста? – MAC

+1

Вы уверены, что получили ошибку? Вы можете вызвать 'e.printStackTrace()' в своем исключении, чтобы получить точный тип исключения и в какой строке он произошел. Это работает как для обычного java, так и для Android (на Android-устройстве он отображается в LogCat). – Jave

+0

Я добавил e.printStackTrace() в свой блок catch перед возвратом, и ничего не появляется в моем LogCat. Если функция возвращает json правильно, и не выводится ошибка, почему тогда отладчик прерывается в точке останова при моем возврате в блоке catch? – Fase

ответ

0

Забудьте о «System.out.println» в Android. Вы можете использовать вид «Logcat» в Eclipse. Это используется для отображения каждого журнала, который вы хотите, с вашего устройства. Кроме того, вы можете заменить «System.out.println(json);» на «Log.e("MyApp", "Here is my Json: '"+json+"'");», и вы увидите вашу JSON в LogCat ...;)

Об исключением, у вас есть метод в frameworkthat автоматически регистрирует исключения в LogCat : «myException.printStackTrace();»

+1

Существует еще один метод Log.e(): [Log.e (String, String, Throwable)] (http://developer.android.com/reference/android/util/Log.html#e%28java.lang .String,% 20java.lang.String,% 20java.lang.Throwable% 29). Он также может использоваться для регистрации исключений. –

+0

Вы правы! Я этого не знал ... Спасибо! :) –

+0

Ничего не появляется в моем LogCat ни с одним из них, когда я использую его в блоке catch перед возвратом, даже если отладчик ломается по возврату. Единственное, что в моем LogCat (которое сидит в нем):?: ??: W /? (?): Невозможно открыть лог-файл '/ dev/log/main': нет такого файла или каталога – Fase

0

Читатель читает текст, двоичные данные InputStream. Мост InputStreamReader нуждается в кодировке символов и принимает в вашем случае стандартную кодировку ОС.

Так лучше явно использовать кодировку:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); 

Как JSON должен лучше быть в UTF-8, я дал это. Но кодировка по умолчанию на Android - это UTF-8 и с вами, вероятно, Cp1252. Так что может быть что-то еще неправильно.

0

Ваш код выглядит правильным. Если вы видели JSON, то вы не получали IOException от close.

Edit:

Ваш обновленный исходный код ясно показывает, что нет возврата из finally или повторить логику в игре здесь. Хорошо.

Посетите следующие настройки в вашей среде: Window/Preferences/Run/Debug/Запуск/"Запуск в режиме отладки, когда рабочая область содержит точки останова"

Установите это Всегда или Подскажите. (Если бы это было ранее Никогда, вы могли бы работать в режиме запуска, используя при этом оптимизацию, которую вы не хотели. Два оператора return могли быть объединены в один оптимизатором.) После того, как вы измените этот параметр, вы должны никогда не видеть удары точки останова в строке, отличной от строки, на которой он был установлен. Пожалуйста, дважды проверьте свои результаты с новыми настройками.

Существует также альтернативный способ взломать исключения (Suspend On Caught Exceptions), которые не защищены от такого рода оптимизации, если по какой-либо причине вы не хотите работать в режиме отладки.

+0

Даже если у меня есть точка останова, расположенная на возврате «» в блоке catch, она все равно ломается в блоке catch. В блоке try нет точки останова. – Fase

+0

@Fase - В этом случае я могу пообещать вам, что пустая строка будет возвращена. Тем не менее, может быть еще один блокирующий блок вниз по стеку, которому удается повторить попытку. –

+0

Пустая строка НЕ ​​возвращается. Возвращается json из URL-адреса. Я вижу json в отладчике, и программа перемещается по нагрузкам изображений из json. Он может гарантировать вам возврат json. – Fase

2

Вы должны убедиться в том, чтобы включить разрешение на

<uses-permission android:name="android.permission.INTERNET" /> 

в вашем androidManifext.xml.

Вы пытаетесь получить данные из удаленного места. На консоли Java вы можете сделать это без таких разрешений, но не в Android.

+0

Он включен и успешно возвращает данные json на Android, но он прыгнул в блок catch и запускает возврат «», но функция на самом деле все еще как-то возвращает данные json, а не пустую строку. – Fase

+0

Вы должны очистить свой проект и повторить попытку. Отладчик Android иногда бывает такими странными вещами. – rekaszeru

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