один простой способ произвести эту ошибку - старый сервер с register_globals = On
. то вам понадобятся только две строки кода:
<?php
$_SESSION["my_var"] = "string";
$my_var = new MyClass(); //could be any class, i guess
?>
, как только вы перезагрузите эту страницу один раз, вы получите ошибку Exception thrown without a stack frame in Unknown on line 0
. похоже, что существует конфликт между экземпляром класса и переменной (session). по крайней мере, так я получил эту досадную ошибку, которую так сложно отлаживать.
Я думаю, что спецификация Java объясняет это лучше всего:
Оператор + синтаксически лево-ассоциативный, независимо от того, определяется ли он анализом типа для представления строки конкатенация или числовое дополнение. В некоторых случаях для получения желаемого результата требуется уход. Например, выражение:
a + b + c
всегда рассматривается как означающее:
blockquote>
(a + b) + c
Итак, если
a
былString
, он объединяется сb
. Результат будет иметь типString
, поэтому он продолжает конкатенацию сc
.
Я также нашел это интересным. Я недавно не работал слишком много в java, но я узнал немного информации, которая может быть полезной, играя с ней.
Я думаю, что это связано с автоматическим типом, который делает java.
System.out.println («1» + 2 + 3);
blockquote>Печатает 123, как вы сказали. Поскольку «1» исполняется как строка, Java предполагает, что первая строка была строкой, последующие будут строкой для конкатенации, если не указано иное
. Хотя этот результат делает печать 15, когда вы определяете тип
System.out.println ("1" + (int) (2 + 3));
blockquote>В этом случае он может завершить операцию перед конкатенацией.
Итак, я думаю, что java предполагает, что первая из них является строкой, остальные останутся строками и конкатенируют их.
EDIT: вы можете увидеть некоторую информацию об автоматическом type-conversion на веб-сайте oracle здесь
System.out.println("1" + (2+3));
также работает, вам не нужно указывать подвыражение на int
– Erwin Bolwidt
10 April 2015 в 03:30
Оператор +
перегружен в компиляторе. Если оба операнда являются числовыми, +
является добавлением. Если оба или оба операнда являются String, +
является конкатенацией строк. (Если один операнд является String, а другой - числовым, число передается в String). Наконец, +
связывается слева направо.
Все это приводит к тому, что составная формула a + b + c + ...
выполняет добавление слева направо, пока не попадет в первый операнд строки, после чего она переключается на конкатенация строк для остальной части формулы. Итак ...
"1" + 2 + 3 + 4 = 1234 /* cat cat cat */
1 + "2" + 3 + 4 = 1234 /* cat cat cat */
1 + 2 + "3" + 4 = 334 /* add cat cat */
1 + 2 + 3 + "4" = 64 /* add add cat */
Это интересная часть строки. Когда String добавляется к любому другому типу данных, результирующее значение представляет собой String. Другая переменная также преобразуется в String и затем конкатенируется. Однако, когда два целых числа работают с знаком +, + действует как оператор сложения, а не оператор конкатенации. Если выражение в методе println () или print () содержит круглые скобки, сначала оценивается значение в круглых скобках. Рассмотрим следующий пример:
int a = 5;
int b = 6;
System.out.println(a + b); // Output will be: 11
System.out.println("5" + "6"); // Output will be: 56
System.out.println("" + a + b); // Output will be: 56
System.out.println(5 + 6 + a + " " + b + a); // Output will be: 16 65
System.out.println("Result: " + a + b); // Output will be: 56
System.out.println("Result: " + (a + b)); // Output will be: 11
Вы можете видеть разницу между двумя последними операциями sysout
byte b =10; b = b+10;//gives type mismatch error
, но нет ошибки, когда вы делаетеbyte c = 10; c+=10; //no error here(implicit typecasting)
? – Nirmal 10 April 2015 в 03:30+=
,/=
и т. Д.) Неявно возвращаются к назначаемому типу, но обычный оператор присваивания=
этого не делает. – Erwin Bolwidt 10 April 2015 в 03:33