Я работал над проектом, который вел себя некорректно, по некоторым причинам не было создано никаких исключений, даже если они должны были возникнуть. В глубине души я обнаружил такую обработку ошибок:
try {
m.invoke(parentObject, paramObj);
} catch (IllegalArgumentException e) {
new CaseLibException(e);
} catch (IllegalAccessException e) {
new CaseLibException(e);
} catch (InvocationTargetException e) {
new CaseLibException(e);
}
Мой мозг распознал, что несколько исключений были обернуты в другое, так что это не так уж и плохо. Но мне пришлось по крайней мере 3 раза наткнуться на этот код, чтобы увидеть, чего не хватает ...
Какую самую глупую ошибку вы не смогли найти?

Фактически не инициализируется некоторая переменная стека в начале main. Вещь обнулялась бы автоматически, ну почти всегда.
Нет, просто неправильно рассчитать. Значение никогда не использовалось в качестве индекса.
У меня была точно такая же проблема ... мог быть поклялся, это, должно быть, ошибка компилятора или космические лучи :) Через несколько часов реальность воцарилась, и я не мог перестать пинать себя ...
Большинство моих глупых ошибок не были настоящими ошибками. Это были неверные данные и мои предположения об этих данных.
Я потратил часы, пытаясь найти ошибку в коде, где ее не было - я отлаживал старый фрагмент кода или предполагал, что мой набор тестовых данных был чем-то ... а это не так.
Однажды, когда я делал домашнее задание, связанное с математическим программированием, мне потребовалось несколько часов, чтобы понять, что у меня есть + где-то там, где мне нужен *.
В C / C++ (который я недавно узнал)
if (x = 0) {
...
}
простой способ предотвратить это - написать наоборот: if (0 == x). Если вы забыли второй = код не компилируется.
Или используйте компилятор с приличными предупреждениями.
@gs: Да, я впервые увидел это здесь. Хотя при переключении с C++ на C# иногда болит голова ...
Не уверен, что это было самое глупое, но самое неприятное, что у меня когда-либо было, было там, где я написал несколько процедур контроля доступа, которые частично зависели от времени суток (так что вы могли написать такие правила, как `` это можно получить только в рабочий день во время ''). часы работы').
Я закончил код и провел все тесты, и все работало нормально. Потом я пошел домой, пришел на следующий рабочий день и провел все свои тесты, но они провалились. Я не мог понять, почему это произошло, поскольку код и все тесты были полностью неизменными.
Оказалось, что сработало летнее время, и мой код не справился с этим.
Я писал парсер с помощью flex / bison. Особенностью была постоянная оптимизация сворачивания, то есть замена 20 + 2 на 22, однако мой синтаксический анализатор заменял его на 4.
В составе лексера у меня была таблица символов. Я использовал линейный поиск с помощью strncpy для поиска существующих записей. Однако для параметра длины в strncpy я использовал strlen для строки в таблице символов. Не очень удачная идея, потому что, если запись в таблице символов меньше, чем добавляемая, она будет неправильно соответствовать. Например, добавление «20» будет соответствовать «2», потому что сравнивается только первый символ. Поэтому, когда мой синтаксический анализатор нашел символ «20», он получил «2». Мне потребовалось несколько часов, чтобы понять, почему мои 20 лет перешли на 2.
Это не моя ошибка, но я присутствовал на ней. Моя жена и я вместе посещали уроки Java, когда учились в колледже. Она занимается антропологией, а я - финансами, но каким-то образом мы оказались в java. Я люблю это.
Она провела весь вечер, пытаясь создать «чертову программу, нарисовавшую глупый $% ^ & * (дом на экране», и просто не смогла. Будучи упрямой, она сопротивлялась любой моей помощи до последнего момента отчаяния (2, 3 часа ночи?). Я быстро взглянул и заметил, что она везде использовала «О» (буква о) вместо «0» (ноль).
На следующий день она ушла из класса.
Лично у меня есть несколько глупых ошибок, которые могут быть обычными. Мои любимые:
знак доллара + имя_функции используя ту же итерацию ($ i) вместо уже зацикленного цикла $ i iterate случайное "" ", которое произошло ГДЕ-ТО, потому что моя рука соскользнула
Однажды я исправил ошибку, когда приложение вылетало каждый день в 18:12.
Оказалось, что кто-то сохранил количество секунд с начала дня в 16-битном int.
лол, +1. Кстати, вы имели в виду 18:12?
Да. Я сделал! Ошибка была обнаружена 21 год назад, и код был написан на MS-Pascal, поэтому моя память уже не та, что была раньше.
16-битное беззнаковый int: P
Действительно. Это было 25 лет назад ...
Когда у меня был гораздо менее опытный язык фигурных скобок, я однажды написал что-то вроде:
if (expr);
stmt;
Это была встроенная система, поэтому мой отладчик и printf были бессильны. Просто звук был плохим. Я списал это на низкую производительность и потратил день или около того на его оптимизацию. Расчет на обратной стороне конверта показал бы, что производительность не была проблемой.
С того дня я всегда вставляю фигурные скобки. Это заставляет меня писать на Python, если бы не остальной язык.
Извините, но фигурные скобки здесь не помогут: по крайней мере, в некоторых компиляторах if (expr); {stmt; } 'компилируется.
); {, очевидно, является ошибкой; ); нет. Если вы дадите скобе отдельную линию, это сделает ее немного менее четкой.
Что у вас никогда не было оправдания для использования произвольной внутренней области видимости?
Да ведь я ни разу в жизни не создавал ошибок!
Давным-давно, когда я учился в школе CS, я реализовал двоичное дерево в (как мне кажется) Turbo Pascal. Одна из операций не совсем корректно обрабатывала свои указатели и заканчивалась перезаписью частей сегмента кода (ах, радости программирования под DOS). В любом случае, это всегда заканчивалось перезаписью всего кода отладки, который я вставлял, делая операторы IF, казалось бы, лживыми, операторы печати не выполнялись и тому подобное, но все это чудесным образом без сбоев и делало практически невозможным определить, что происходит.
В конце концов я прогнал его через отладчик на уровне сборки и поймал проблему, когда инструкции начали меняться в середине функции ...
Я не могу назвать вам конкретную ошибку, с которой я столкнулся, но могу сказать, что вы участвовали по крайней мере в одном из следующего:
Собственно это список причин всех моих ошибок;)
Однажды я написал функцию для преобразования строки даты и времени в другой формат. В нем у меня был оператор switch / case, который анализирует значения месяца, он выглядел так:
case month of:
01: return "Jan"; break;
02: return "Feb"; break;
... etc ...
09: return "Sep"; break;
11: return "Nov"; break;
12: return "Dec"; break;
end;
Я почему-то пропустил октябрь ...
и никакого значения по умолчанию ... у вас всегда должно быть значение по умолчанию!
Может быть, по умолчанию должен был быть «Октябрь»!
Кроме того, как мы можем забыть ошибки, внесенные злом СКОПИРОВАТЬ И ВСТАВИТЬ !!
for i = 0 to ( list.Length - 1 ) do
begin
DoSomething( 1 );
end;
Попробуйте найти что на грязном мониторе с крошечным шрифтом в 3 часа ночи! ;)
Еще бывает: long something = 2l: это 2л или двадцать один?
Сегодня утром я починил одну из них!
Однажды я отлаживал программу, которая была многопоточной, но в которой многопоточность можно было отключить. Программа произвела segfault случайным образом, но только при включенной многопоточности. Попытавшись изолировать все возможные состояния гонки, я понял, что единственная проблема заключалась в том, что я писал за пределами массива. В однопоточном режиме распределитель памяти распределял память предсказуемо, так что данные по адресу непосредственно над этим массивом больше не требовались к моменту перезаписи, поэтому у ошибки не было никаких симптомов. В многопоточном режиме данные по этим адресам принадлежали другим потокам.
Не самое худшее, но недавний пример зла тернарного оператора:
На какое-то время я озадачился, почему columnCSV всегда был пустым:
foreach(Column column in Table.Columns)
{
columnsCSV += string.IsNullOrEmpty(columnsCSV) ? "" : "," + column.Name;
}
Должно было
foreach(Column column in Table.Columns)
{
columnsCSV += (string.IsNullOrEmpty(columnsCSV) ? "" : ",") + column.Name;
}
P.S. Пожалуйста, игнорируйте зло «отсутствие StringBuilder».
} и иногда )
Раньше, когда у нас был код на карточках, я работал три дня, пытаясь понять, почему мои пакетные задания не работали. Я наконец дошел до ПЕЧАТИ утверждений о каждых трех строках, и я не видел НИКАКОЙ из них.
Затем я понял, что произошла ошибка JCL, из-за которой моя программа не загружалась в соответствующий набор данных (думаю, «не попадает в путь»), поэтому я запускал одно и то же старое изображение снова и снова, вместо недавно скомпилированный.
JCL - теперь это взрыв из прошлого.
I=1
Эта единственная строка Fortran просто не работала.
После нескольких часов бесплодной отладки я проглотил свою гордость и вместе со мной прошел через код.
Подойдя к этой строке, я сказал: «А теперь мы увеличиваем индекс».
"Хм?" говорит он.
Тогда я понял, что читаю свое намерение:
I=I+1
вместо того, что я написал.
Помните, что в следующий раз вы застрянете и не сможете понять, что случилось.
Не позволяйте своей гордости помешать вам привлечь вторую пару глаз.
Бог с ним. Я работал над проектом с парнем, в котором я должен был реализовать VHDL для процессора, и он должен был написать сборку для ее тестирования. Он поклялся, что с его кодом все в порядке. Я потратил день, пытаясь отладить свой код, и потерял сон из-за точно такой же ошибки в его сборке, когда настоял на том, чтобы просмотреть ее. Все еще зол на этого парня.
Как это для ошибки, которая сводит вас с ума, пытаясь понять, что происходит:
#if CONFIG_SETTING == 1
#define SOME_MACRO( x) doSomething( x);
#else
#define SOME_MAcRO( x) // don't do it in retail
#endif
void foo( int a, int b)
{
if (a < b) SOME_MACRO( a);
alwaysCallThisFcn();
// ...
}
Итак, если CONFIG_SETTING равен 1, foo () компилируется как:
void foo( int a, int b)
{
if (a < b) doSomething( a);; // note: the second
// semi-colon has no effect
alwaysCallThisFcn();
// ...
}
В противном случае он компилируется как:
void foo( int a, int b)
{
if (a < b)
alwaysCallThisFcn(); // now alwaysCallThisFcn() is
// called conditionally
// ...
}
Да, это было бы. Чтобы избежать этого, оставьте точку с запятой в определении.
Подождите, не так ли; после SOME_MACRO (a) просто сделать if пустым? Я что-то пропустил?
Моя самая глупая ошибка была:
if (a=!0)
вместо:
if (a!=0)
Мне потребовалось около 4 часов, чтобы определить проблему, поскольку компилятор просто сошел с ума! Я чуть не умер, когда понял это!
Это одна из моих ранних глупых ошибок.
У нас есть существующий проект для работы, где есть WebMethod, написанный на C#.
switch (option) {
case "one" :
//ToDos
break;
case "two" :
//ToDos
break;
case "three" :
//ToDos
break;
}
В то время как из clientCode (через ajax) мы получили следующее как option
One
Two
Three
Я не мог понять, в чем проблема, минут через 30-40 я попал.
Я исправил это как
switch (option.ToLower()) {
... и программа вылетела бы, если бы этого не произошло? :)