java становится нелогичным при делении на ноль [дубликат]

FTP-клиенты .NET framework (FtpWebRequest или WebClient) не могут подключиться с использованием прокси SOCKS, поддерживаются только HTTP [только скачивание] и прокси-серверы ISA :

Класс FtpWebRequest поддерживает прокси-серверы HTTP и ISA Firewall Client.

Если указанный прокси-сервер является прокси-сервером HTTP, поддерживаются только команды DownloadFile, ListDirectory и ListDirectoryDetails.

blockquote >

Итак, вам нужно использовать стороннюю библиотеку FTP.


Например, с помощью сборки WinSCP .NET вы можете использовать:

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "example.com",
    UserName = "user",
    Password = "mypassword",
};

// Configure proxy
sessionOptions.AddRawSettings("ProxyMethod", "2"); // SOCKS5 proxy
sessionOptions.AddRawSettings("ProxyHost", "proxy");

using (Session session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Your code
}

Для параметров для SessionOptions.AddRawSettings см. исходные настройки .

Легче, чтобы WinSCP GUI генерировал C # FTP код шаблона для вас.

Обратите внимание, что сборка WinSCP .NET не является родной библиотекой .NET. Это довольно тонкая оболочка .NET поверх консольного приложения.

(я автор WinSCP)

66
задан Aziz Shaikh 1 October 2012 в 10:46
поделиться

5 ответов

Результат деления на ноль, математически говоря, неопределен, который может быть выражен с помощью float / double (поскольку NaN - а не число), однако он не является неправильным в любом фундаментальном смысле.

Поскольку целое число должно содержать определенное числовое значение, при обработке с ним необходимо обнулить ошибку при делении на ноль.

43
ответ дан RubioRic 23 August 2018 в 00:46
поделиться
  • 1
    В точку. Это определено в Java Language Spec здесь: java.sun.com/docs/books/jls/third_edition/html/… – Michael Myers♦ 4 March 2010 в 19:02
  • 2
    Я думаю, что должен быть Integer.NaN – OscarRyz 4 March 2010 в 19:16
  • 3
    @trinithis: ваше объяснение не имеет ничего общего с тем, почему нет Integer.NaN. Причина в том, что стандарт IEEE для арифметики с плавающей запятой задает такие специальные значения, тогда как квазистандарт для целочисленной арифметики (дополнение двух) не имеет таких специальных значений, тем самым оставляя ее разработчикам, как иметь дело с делением на ноль (повышение прерывания или исключение, обозначая особое значение или просто оставляя результат неопределенным). – Michael Borgwardt 4 March 2010 в 20:29
  • 4
    @Kris: Строго говоря, это не может быть бесконечно, потому что lim (1 / x) отличается от x - & gt; 0+ и x - & gt; 0-. Но это незначительный каламбур. – eaolson 6 March 2010 в 18:33
  • 5
    x / 0 НЕ бесконечно, результат не определен. x / y стремится к бесконечности, когда y стремится к 0. Извините за нить necro. – So Many Goblins 7 November 2013 в 20:48

Типы Java float и double, например, практически любой другой язык (и почти любой аппаратный модуль FP), реализуют стандарт IEEE 754 для математики с плавающей запятой, который предусматривает деление на ноль, чтобы вернуть особое значение «бесконечности».

Целочисленная арифметика (реализована как представление двух дополнений Java и большинства других языков и аппаратных средств) отличается и не имеет специальных значений бесконечности или NaN , поэтому бросание исключений - полезное поведение там.

106
ответ дан Michael Borgwardt 23 August 2018 в 00:46
поделиться
  • 1
    Правильный ответ на этот вопрос должен быть таким. Мне нужно было знать, почему float и double не вызывают исключения. Благодарю. – Cengiz Can 21 October 2011 в 10:25
  • 2
    Это должен быть обозначенный правильный ответ. Ответ, который в настоящее время отмечен как правильный, не отвечает на вопрос, и не дает понять, что Java следует за IEEE 754. – Necrototem 6 October 2016 в 16:14

Способ сохранения двойника сильно отличается от int. См. http://firstclassthoughts.co.uk/java/traps/java_double_traps.html для более подробного объяснения того, как Java обрабатывает двойные вычисления. Вы также должны прочитать цифры чисел с плавающей запятой, в частности понятие Not a Number (NaN) .

Если вам интересно узнать больше о представлении с плавающей запятой, я бы посоветовал прочитать этот документ (формат Word, извините). Он вникает в двоичное представление чисел, что может быть полезно для вашего понимания.

4
ответ дан Mike 23 August 2018 в 00:46
поделиться

При делении на ноль (0 или 0.00)

  1. Если вы разделите double на 0, JVM покажет Infinity. public static void main(String [] args){ double a=10.00; System.out.println(a/0); } Консоль: Infinity
  2. Если вы разделите int на 0, тогда JVM будет генерировать арифметическое исключение. public static void main(String [] args){ int a=10; System.out.println(a/0); } Консоль: Exception in thread "main" java.lang.ArithmeticException: / by zero
  3. Но если мы разделим int на 0.0, тогда JVM покажет Infinity: public static void main(String [] args){ int a=10; System.out.println(a/0.0); } Console: Infinity

Это потому что JVM автоматически вводит cast int в double, поэтому мы получаем бесконечность вместо ArithmeticException.

1
ответ дан Raman Gupta 23 August 2018 в 00:46
поделиться

Хотя разработчики Java знают о двойном примитивном типе и классе Double, делая арифметику с плавающей запятой, они не уделяют достаточного внимания Double.INFINITY, NaN, -0.0 и другим правилам, которые определяют арифметические вычисления с их участием.

Простой ответ на этот вопрос заключается в том, что он не будет бросать ArithmeticException и возвращать Double.INFINITY. Также обратите внимание, что сравнение x == Double.NaN всегда оценивается как false, даже если x само является NaN.

Чтобы проверить, является ли x NaN, следует использовать вызов метода Double.isNaN(x), чтобы проверить, является ли заданное число NaN или нет. Это очень близко к NULL в SQL.

Это может быть полезно для вас.

3
ответ дан ziyapathan 23 August 2018 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: