Другим случаем, когда NullReferenceExceptions
может случиться, является (неправильное) использование оператора as
:
class Book {
public string Name { get; set; }
}
class Car { }
Car mycar = new Car();
Book mybook = mycar as Book; // Incompatible conversion --> mybook = null
Console.WriteLine(mybook.Name); // NullReferenceException
Здесь Book
и Car
являются несовместимыми типами; a Car
не может быть преобразован / передан в Book
. Когда этот сбой завершается неудачно, as
возвращает null
. Используя mybook
после этого, вы вызываете NullReferenceException
.
В общем случае вы должны использовать cast или as
, как показано ниже:
Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:
ComicBook cb = (ComicBook)specificBook;
Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as
:
ComicBook cb = specificBook as ComicBook;
if (cb != null) {
// ...
}
0.01 не является целым числом (целым числом), поэтому вы, конечно, не можете его разобрать. Вместо этого используйте Double.parseDouble
или Float.parseFloat
.
Использовать,
String s="0.01";
int i= new Double(s).intValue();
Использование BigDecimal для округления:
String s1="0.01";
int i1 = new BigDecimal(s1).setScale(0, RoundingMode.HALF_UP).intValueExact();
String s2="0.5";
int i2 = new BigDecimal(s2).setScale(0, RoundingMode.HALF_UP).intValueExact();
предположим, что мы берем целое число в строке.
String s = "100"; int i = Integer.parseInt (s); или int i = Integer.valueOf (s);
, но в вашем вопросе число, которое вы пытаетесь сделать, - это целое число
String s = "10.00"; / g3]
double d = Double.parseDouble (s);
int i = (int) d;
blockquote>Таким образом вы получаете ответ от значение, которое вы пытаетесь получить.
Этот вид преобразования на самом деле невероятно неинтуитивный в Java
Возьмем, например, следующую строку: «100.00»
C: простая стандартная библиотечная функция по крайней мере с 1971 года ( Откуда взялось имя `atoi`? )
int i = atoi(decimalstring);
Java: обязательный проход методом двойного (или Float), за которым следует cast
int i = (int)Double.parseDouble(decimalstring);
У Java наверняка есть некоторые странности в рукаве
100
). Невозможно узнать, действительно ли atoi
разбирал все в строке или нет, содержит ли строка число или число переполняет этот тип. strtol
- лучшая альтернатива, где все вещи, описанные выше, могут быть обнаружены. Java более строгая, но она гарантирует, что все эти случаи будут покрыты.
– nhahtdh
9 September 2013 в 14:27
Double.valueOf("16543").intValue();
. Поэтому Java хочет быть PITA, когда вы хотите быстро преобразовать в int, но Double намного более общий.
– Someone Somewhere
12 December 2013 в 23:49
использовать этот
int number = (int) Double.parseDouble(s);
Используйте Double.parseDouble(String a)
то, что вы ищете, не является целым числом, поскольку оно не является целым числом.
String s = "0.01";
double d = Double.parseDouble(s);
int i = (int) d;
Причиной исключения является то, что целое число не содержит рациональных чисел (= в основном дробей). Итак, попытка разобрать 0.3
на int - это вздор. Тип double
или float
может содержать рациональные числа.
Способ, которым Java передает double
в int
, выполняется , удаляя часть после десятичного разделителя округлением к нулю .
int i = (int) 0.9999;
i
будет нулевым.