За исключением утверждения с нулевой длиной, символ на входе всегда будет потребляться при сопоставлении. Если вы когда-либо находитесь в случае, когда вы хотите захватить определенный символ во входной строке больше один раз, вам понадобится утверждение нулевой длины в регулярном выражении.
Существует несколько утверждений с нулевой длиной (например, ^
(начало ввода / строки), $
(конец ввода / строка), \b
(граница слова)), но look-arounds ((?<=)
позитивный внешний вид и (?=)
позитивный прогноз вперед ) - это единственный способ захватить перекрывающий текст из ввода. Отрицательные взгляды ((?<!)
негативный внешний вид, (?!)
негативный взгляд вперед] здесь не очень полезны: если они утверждают, что истина, то захват внутри потерпел неудачу; если они утверждают false, то совпадение не выполняется. Эти утверждения являются нулевой длиной (как упоминалось ранее), что означает, что они будут утверждать, не потребляя символы во входной строке. Они будут фактически соответствовать пустой строке, если утверждение прошло.
Применяя указанное выше знание, регулярное выражение, которое работает для вашего случая, будет:
(?=(\w\w))
Один из способов получить эту ошибку в Eclipse:
A
в src/test/java
. B
в src/main/java
который использует класс A
. Результат: Eclipse будет компилировать код, но maven предоставит «Невозможно найти символ».
Основная причина: Eclipse использует комбинированный путь сборки для основного и тестового деревьев. К сожалению, он не поддерживает использование разных путей сборки для разных частей проекта Eclipse, чего требует Maven.
Решение:
«Невозможно найти» означает, что компилятор, который не может найти подходящую переменную, метод, класс и т. д., если вы получили этот массаж ошибок, прежде всего, вы хотите найти строку кода, где вы получите массаж с ошибкой. И то вы сможете найти, какая переменная, метод или класс не определены перед ее использованием. После подтверждения инициализации этой переменной, метод или класс могут быть использованы для последующего использования ... Рассмотрим следующий пример.
I создадим демонстрационный класс и напечатаем имя ...
class demo{
public static void main(String a[]){
System.out.print(name);
}
}
Теперь посмотрим на результат.
Эта ошибка говорит: «имя переменной не может найти». Определить и инициализировать значение для переменной «имя» можно отменить эту ошибку. Фактически, это
class demo{
public static void main(String a[]){
String name="smith";
System.out.print(name);
}
}
Теперь посмотрим на новый вывод ...
Ok Успешно решена эта ошибка .. В то же время, если вы можете получить «не можете найти метод» или «не можете найдите класс «что-то». Сначала определите класс или метод и после использования ..
Если вы получаете эту ошибку в сборке где-то в другом месте, в то время как ваша среда IDE говорит, что все в порядке, проверьте, используете ли вы одни и те же версии Java в обоих местах.
Например, Java 7 и Java 8 имеют разные API, поэтому вызов несуществующего API в старой версии Java приведет к этой ошибке.
Еще один пример «Variable is out of scope»
Как я уже неоднократно видел подобные вопросы, может быть, еще один пример того, что является незаконным, даже если он может чувствовать в порядке.
Рассмотрим этот код:
if(somethingIsTrue()) {
String message = "Everything is fine";
} else {
String message = "We have an error";
}
System.out.println(message);
Это неверный код. Поскольку ни одна из переменных с именем message
не видна за пределами их соответствующей области действия - в данном случае это будут окружающие скобки {}
.
Вы могли бы сказать: «Но переменная с именем отображается в любом виде, поэтому сообщение указано , определенное после if
».
Но вы ошибаетесь.
У Java нет операторов free()
или delete
, поэтому он должен полагаться на область отслеживания переменных, чтобы узнать, когда переменные больше не используются (вместе со ссылками на эти переменные причины).
Это особенно плохо, если вы считаете, что сделали что-то хорошее. Я видел такую ошибку после «оптимизации» кода следующим образом:
if(somethingIsTrue()) {
String message = "Everything is fine";
System.out.println(message);
} else {
String message = "We have an error";
System.out.println(message);
}
«О, есть дублированный код, давайте вытащить эту общую строку» -> и вот оно.
. Наиболее распространенным способом борьбы с этим видом проблемы является предварительная привязка значений else к именам переменных во внешней области, а затем переназначение, если:
String message = "We have an error";
if(somethingIsTrue()) {
message = "Everything is fine";
}
System.out.println(message);
final
.
– Daniel Pryden
3 April 2018 в 13:43
Я тоже получал эту ошибку. (для которого я googled, и я был направлен на эту страницу)
Проблема: я вызывал статический метод, определенный в классе проекта A из класса, определенного в другом проекте B. Я получал следующее error:
error: cannot find symbol
Решение: я решил это, сначала построив проект, где метод определен, а затем проект, из которого вызывается метод.
Для подсказок посмотрите на имя имени класса, которое выдает ошибку и номер строки, например: Ошибка компиляции [ERROR] \ applications \ xxxxx.java: [44,30] ошибка: не удается найти символ
Еще одна причина - неподдерживаемый метод для java-версии: jdk7 vs 8. Проверьте свой% JAVA_HOME%
Вы также получите эту ошибку, если забудете new
:
String s = String();
в сравнении с
String s = new String();
String s = ""; int len = s.length;
– Ryan Haining 3 November 2017 в 01:59String[] strings = { "hello", "world" }; strings.chatAt(3);
. – MC Emperor 13 August 2018 в 11:14