JavaRush /Блоги Java /Random-TG /Сабти Java. Як тӯби стектрасро кушоед

Сабти Java. Як тӯби стектрасро кушоед

Дар гурӯҳ нашр шудааст
"Нимаи хайр, имрӯз дар сайти саноатӣ ҳодиса ба қайд гирифта шуд, ман аз таҳиягар хоҳиш мекунам, ки ба гурӯҳи таҳлилӣ ҳамроҳ шавад." Яке аз рӯзҳои коратон метавонад чунин чизеро оғоз кунад, ё ин ки субҳ бошад - муҳим нест. Аммо биёед аз аввал сар кунем. Бо ҳалли мушкилот дар ин ҷо дар JavaRush, шумо навиштани codeеро меомӯзед, ки кор мекунад ва он чизеро, ки аз он интизор аст, иҷро мекунад. Агар шумо ба бахши кӯмак нигаред , маълум аст, ки ин на ҳама вақт бори аввал кор мекунад. Дар кор хам хамин тавр мешавад. Шумо на ҳамеша мушкилотро бори аввал ҳал мекунед: хатоҳо шарикони абадии мо мебошанд. Муҳим аст, ки шумо метавонед рӯйдодҳои хатогиро барқарор кунед. Сабткунї.  Як тӯби стектрасро кушоед - 1Биёед бо як мисол оғоз кунем. Биёед тасаввур кунем, ки шумо полис ҳастед. Шуморо ба ҷои ҳодиса даъват карданд (шиша дар мағоза шикаста буд), шумо омадед ва онҳо аз шумо дар бораи ҳодиса интизоранд. Аз куҷо сар кардан? Ман намедонам, ки полис чӣ гуна кор мекунад. Хеле шартӣ - онҳо ба ҷустуҷӯи шоҳидон, далелҳо ва ҳама чизҳо шурӯъ мекунанд. Чӣ мешавад, агар худи макон ба шумо муфассал нақл кунад, ки чӣ рӯй дод? Масалан, ба ин монанд:
  • 21:59 соҳиби ҳушдорро даргиронд (5 дақиқа то пурра фаъол шудан)
  • 22:00 соҳиби дарро баста
  • 22:05 фаъолсозии пурраи ҳушдор
  • 22:06 соҳиби дастаки кашид
  • 23:15 сенсори садо фаъол шуд
  • 23:15 Як даста сагҳо давида, бо овози баланд аккос заданд
  • 23:15 сенсори садо хомӯш
  • 01:17 сенсори зарба дар шишаи берунии дисплей фаъол шуд
  • 01:17 кабӯтаре ба шиша парвоз кард
  • 01:17 шиша шикаст
  • 01:17 сирена фаъол аст
  • 01:17 кабутар худро чунбонда, парвоз кард
Хуб, ба шумо лозим нест, ки ин тафсилотро муддати тӯлонӣ омӯзед; фавран маълум мешавад, ки чӣ рӯй дод. Дар рушд низ ҳамин тавр аст. Ин хеле аҷиб аст, вақте ки шумо метавонед аз сабтҳо бифаҳмед, ки чӣ рӯй дод. Ҳоло шумо шояд хатогиро дар хотир доред, зеро шумо метавонед ҳама чизро ислоҳ кунед. Аммо не. Шумо ба хона рафтед ва шабона ҳама чиз вайрон шуд, чизе барои ислоҳ кардан нест: шумо бояд фаҳмед, ки чаро он шикастааст ва ислоҳ кунед. Дар ин ҷо логҳо ба бозӣ меоянд, таърихи ҳама чизе, ки дар як шаб рӯй дод. Дар рафти мақола, ман ба шумо пешниҳод мекунам, ки дар бораи он ки яке аз дарахтбурҳои машҳури (аслан як чӯҷачин нест, бештар ба мониторинг), ки ҳар касе, ки хабарро мешунавад (тамошо мекунад) шунидааст, фикр кунед? Бо шарофати ӯ баъзе чорабиниҳо барқарор карда мешаванд. Акнун биёед ҷиддӣ муносибат кунем. Воридшавӣ ба Java раванди сабти ҳама гуна ҳодисаҳои дар code рухдодашуда мебошад. Масъулияти шумо ҳамчун барномасоз аст, ки рамзи шумо чӣ кор кард, нависед, зеро пас ин гузоришҳо барои таҳлил ба шумо дода мешаванд. Агар ҳама чиз хуб анҷом дода шавад, он гоҳ ҳама хатогиҳо хеле зуд мураттаб ва ислоҳ карда мешаванд. Дар ин ҷо, ман шояд дар бораи он ки чӣ гуна дарахтбурҳо вуҷуд доранд, намефаҳмам. Дар ин мақола мо худамонро бо оддӣ маҳдуд мекунем java.util.Logger: ин барои шиносоӣ бо ҳамдигар кофӣ аст. Ҳар як сабти гузориш дорои санаи вақт, сатҳи рӯйдодҳо, паёмҳо мебошад. Сана ва вақт ба таври худкор ворид карда мешаванд. Сатҳи ҳодиса аз ҷониби муаллифи паём интихоб карда мешавад. Якчанд сатҳҳо вуҷуд доранд. Асосҳо инҳоянд: маълумот, ислоҳ, хато.
  • INFO - одатан инҳо паёмҳои иттилоотӣ дар бораи рӯйдодҳо мебошанд, чизе ба монанди таърих аз рӯи сана: 1915 - чизе рӯй дод, 1916 - чизи дигар.
  • DEBUG - воқеаҳои як лаҳзаи мушаххасро муфассалтар тасвир мекунад. Масалан, тафсилоти ҷанг дар таърих дар сатҳи ислоҳ аст." Командир Такойтович бо артиши худ ба сӯи деҳаи Селовича пеш рафт ."
  • ERROR - хатогиҳое, ки рух медиҳанд, одатан дар ин ҷо навишта мешаванд. Эҳтимол шумо пай бурдаед, ки вақте ки шумо чизеро печонед try-catch, блок catchбо e.printStacktrace(). Он танҳо вурудро ба консол мебарорад. Бо истифода аз як сабткунанда, шумо метавонед ин сабтро ба қайдгир фиристед (ҳаха), шумо идеяро пайдо мекунед.
  • Огоҳӣ - огоҳиҳо дар ин ҷо навишта шудаанд. Масалан, чароғи аз ҳад зиёд гарм шудани мошин. Ин танҳо як огоҳӣ аст ва беҳтар аст, ки чизеро тағир диҳед, аммо ин вайроншавӣ нест. Вақте ки мошин вайрон мешавад, мо бо сатҳи ERROR ворид мешавем.
Мо сатҳҳоро ҷудо кардем. Аммо хавотир нашав: хатти байни онхо хеле тунук аст — на хар кас инро шарх дода метавонад. Илова бар ин, он метавонад аз лоиҳа ба лоиҳа фарқ кунад. Таҳиягари калон ба шумо мефаҳмонад, ки дар кадом сатҳ ва чӣ сабт шудан лозим аст. Муҳим он аст, ки ин сабтҳо барои шумо барои таҳлor оянда кофӣ мебошанд. Ва ин дар парвоз фаҳмида мешавад. Оянда танзимот мебошанд. Ба қайдгирандагон гуфта мешавад, ки дар куҷо нависед (ба консол, файл, jms ё ҷои дигар) ва сатҳро муайян кунед (маълумот, хатогӣ, дебаг...). Намунаи танзимот барои сабти оддии мо чунин аст:
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler

java.util.logging.FileHandler.level     = INFO
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append    = true
java.util.logging.FileHandler.pattern   = log.%u.%g.txt

java.util.logging.ConsoleHandler.level     = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
Дар ин ҳолат, ҳама чиз танзим карда мешавад, ки сабткунанда дар як вақт ба файл ва ба консол менависад. Дар он сурат? агар чизе дар консол тоза карда шавад, инчунин ҷустуҷӯ аз рӯи файл осонтар аст. Сатҳи INFO барои ҳарду. Намунаи ном низ барои файл муайян карда шудааст. Ин конфигуратсияи ҳадди аққалест, ки ба шумо имкон медиҳад, ки якбора ҳам ба консол ва ҳам файл нависед. java.util.logging.FileHandler.appendба true муқаррар кунед , то вурудоти кӯҳна дар файл тоза карда нашавад. Намунаи истифода ин аст (бидуни шарҳҳо, қайдгиранда дар бораи худ шарҳ медиҳад):
public class Main {
    static Logger LOGGER;
    static {
        try(FileInputStream ins = new FileInputStream("C:\\log.config")){ \\полный путь до file с конфигами
            LogManager.getLogManager().readConfiguration(ins);
            LOGGER = Logger.getLogger(Main.class.getName());
        }catch (Exception ignore){
            ignore.printStackTrace();
        }
    }
    public static void main(String[] args) {
        try {
            LOGGER.log(Level.INFO,"Начало main, создаем лист с типизацией Integers");
            List<Integer> ints = new ArrayList<Integer>();
            LOGGER.log(Level.INFO,"присваиваем лист Integers листу без типипзации");
            List empty = ints;
            LOGGER.log(Level.INFO,"присваиваем лист без типипзации листу строк");
            List<String> string = empty;
            LOGGER.log(Level.WARNING,"добавляем строку \"бла бла\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла бла");
            LOGGER.log(Level.WARNING,"добавляем строку \"бла 23\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла 23");
            LOGGER.log(Level.WARNING,"добавляем строку \"бла 34\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла 34");


            LOGGER.log(Level.INFO,"выводим все элементы листа с типизацией Integers в консоль");
            for (Object anInt : ints) {
                System.out.println(anInt);
            }

            LOGGER.log(Level.INFO,"Размер equals " + ints.size());
            LOGGER.log(Level.INFO,"Получим первый элемент");
            Integer integer = ints.get(0);
            LOGGER.log(Level.INFO,"выведем его в консоль");
            System.out.println(integer);

        }catch (Exception e){
            LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
        }
    }
}
Ин беҳтарин намуна нест, ман намунаеро гирифтам, ки дар даст буд. Намунаи баромад:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Начало main, создаем лист с типизацией Integers
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист Integers листу без типипзации
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист без типипзации листу строк
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла бла" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 23" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 34" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
INFO: выводим все элементы листа с типизацией Integers в консоль
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: что-то пошло не так
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
	at generics.Main.main(Main.java:45)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Дар ин ҷо ман мехоҳам ба қайдҳо диққат диҳам:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
Ин вуруд комилан бефоида ва иттилоотӣ нест. Мисли вуруди хато:
WARNING: что-то пошло не так
Шумо набояд инро нависед: ин як чӯб ба хотири як чӯб аст, он танҳо дар роҳ мешавад. Кӯшиш кунед, ки ҳамеша чизҳои пурмазмун нависед. System.out.printlnМан фикр мекунам, ки ин барои қатъ кардани истифодаи он ва гузаштан ба бозичаҳои калонсолон кофӣ аст . Он java.util.loggingкамбудиҳо дорад. Масалан, сатҳҳое, ки ман дар боло тавсиф кардам, дар ин ҷо нестанд, аммо онҳо дар логгерҳои бештар истифодашаванда ҳастанд. Ман онро барои ин мақола интихоб кардам, java.util.loggingзеро он бо пайвастшавӣ ба манипуляцияҳои иловагӣ ниёз надорад. Ман инчунин қайд мекунам, ки онро LOGGER.infoба ҷои истифода бурдан мумкин аст LOGGER.log(Level.INFO... Яке аз нуқсонҳои аллакай дар ин ҷо пайдошуда: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- он ба шумо имкон медиҳад, ки паём ва an objectро интиқол диҳед Exception, худи сабтгоҳҳ онро зебо менависад. Дар айни замон, LOGGER.warning("");он танҳо паём қабул мекунад, яъне. Истисноро гузаронидан мумкин нест, шумо бояд онро худатон ба сатр тарҷума кунед. Умедворам, ки ин мисол барои шиносоӣ бо сабти Java кофист. Пас шумо метавонед логгерҳои дигарро (log4j, slf4j, Logback...) пайваст кунед - онҳо бисёранд, аммо моҳият як аст^ барои сабти таърихи амалҳо. Дастури расмӣ
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION