來看懂游戲《Minecraft》的崩潰報告吧! 服務端/客戶端

文章推薦指數: 80 %
投票人數:10人

來看懂游戲《Minecraft》的崩潰報告吧! 服務端/客戶端. ... [WARNING] 本篇適用于Minecraft服務端/客戶端報錯的診斷分析,其他游戲除外,比如網易 菜單 網站主頁 前端設計 後端開發 .NET開發 軟體設計 企業開發 區塊鏈 移動端開發 軟體工程 資料庫 作業系統 其他 主頁 > 其他 > 來看懂游戲《Minecraft》的崩潰報告吧!服務端/客戶端 來看懂游戲《Minecraft》的崩潰報告吧!服務端/客戶端 2020-09-1118:58:02其他 如何看懂Minecraft報錯的關鍵資訊,   讓你如何看懂Minecraft報錯 前言 一些俏皮話 尋找崩潰日志 打開崩潰日志 重要的事說三遍 下載文本編輯器 開始分析 深度分析 得出結論 修復報錯 解決方案 看懂更多 結束   前言 [WARNING]本篇適用于Minecraft服務端/客戶端報錯的診斷分析,其他游戲除外,比如網易 [WARNING]本篇適用于Minecraft服務端/客戶端報錯的診斷分析,其他游戲除外,比如網易 [WARNING]本篇適用于Minecraft服務端/客戶端報錯的診斷分析,其他游戲除外,比如網易 我所說的報錯,指的是一款名為《Minecraft》的游戲中的報錯,并不是《我的世界》的報錯 在大家游玩Minecraft時,有時需要裝一些Forge模組以此來提高可玩度,但自己配置模組包的時候,總會造成游戲崩潰,并且大多數人還看不懂崩潰報告更有甚者連崩潰報告輸出目錄都不知道在哪,于是本篇教程應運而生, 一些俏皮話 Minecraft這個游戲,各種BUG和解決方案如果寫成一堆不重復的書,摞起來的厚度可以比姚明還高, 所以這個游戲不是一般的神奇,尤其是當你在看崩潰報告的時,你更會體驗到這一點, 你不加模組,MC也會崩潰,加了還是崩潰,這是一個比較罕見的情況, 大多數情況是你一股腦加了一堆模組,然后突然蹦了,就不知道怎么辦了, 幸運的是,這時候,你有60%的概率可以找到問題所在并解決這個問題, 尋找崩潰日志 首先,你得知道你的客戶端/服務端目錄 客戶端的CrashReport檔案夾目錄:(.minecraft\crash-reports) 如果你啟用了版本隔離,那就在(.minecraft\versions\xxxx\crash-reports) 服務端的CrashReport在你的服務端根目錄下, 這個條件的前提是你的服務端是人類已知的服務端,而不是外星人制造的服務端, 打開崩潰日志 接下來我們對報錯的分析,均以一個Minecraft1.12.2Forge服務端為例 嗯,我們可以看到,crashreport目錄下的所有檔案都是以 crash-日期_具體時間-server.txt命名的 如果是客戶端的崩潰報告日志,后面的server則是client, 然后我們找到一個最新的日志打開并分析, 告訴你怎么瞬間找到最新崩潰日志, 直接點擊這個按鈕就完事了,然后會按照報告的生成時間進行排列, 重要的事說三遍 接下來我們對報錯的分析,均以一個Minecraft1.12.2Forge服務端為例 接下來我們對報錯的分析,均以一個Minecraft1.12.2Forge服務端為例 接下來我們對報錯的分析,均以一個Minecraft1.12.2Forge服務端為例 下載文本編輯器 首先你需要一個文本編輯器來查看崩潰報告, 這里我推薦微軟官方的VisaulCode:點我下載. 然后我們就可以愉快地打開報告進行查看了, 開始分析 好了,我們說了這么多廢話,是時候開始正式的分析了, 我估計前面的事大多數人已經做完了,就等著我講這個, 廢話不多說,開始, 打開后我們首先看到的是這個 其中,WARNINGcoremodsarepresent:xxxxx是廢話,你根本不用管, 產生這種警告是因為有的作者動了Minecraft底層的代碼,然后Forge為了方便,給你整出來了, 在99.9999999%的情況下,coremods在理論上不會造成崩潰,所以你可以忽略這些, 再往下看, 我們先引出幾個重要概念,當然你不用理解, 你會發現這些報錯里都會有一大堆的文字: atnet.xxxxx atorg.xxxxxxxx atcom.xxxxxx atjava.lang.xxxx 這些有專門的術語,叫做堆疊幀(stacktrace), 平時我們運行Minecraft等java應用程式,是在JVM上運行的,JVM里記憶體被劃分為五大塊,分別是:      1.  CPU暫存器;     2.   本地方法堆疊;     3.   方法區;       4.   堆疊記憶體;       5.   堆記憶體,暫存器部分容量不夠存放太多資料,所以運行中的代碼方法會存放在記憶體中一個叫堆疊記憶體內,你可以理解為一個方法一個堆疊幀,假設報錯有20個atxxx.xxx,那就意味著有20個方法被呼叫過了,而會出現這么多的堆疊幀的原因,是因為上一個堆疊幀爆出例外后并沒有相應的例外處理器去捕獲,就會接著爆,報錯堆疊幀就會形成套娃式增長,所以往往最的堆疊幀就是最后爆出例外的,越往上,這些方法存在問題的可能性也就越大, 我們可以看見,頂上有 這3行東西, 第一行是廢話,你可以不用管, 第二行這個報告中最后一個堆疊幀拋出例外的時間, 第三行是這個報錯的描述,也就是人類可讀的大白話形式, 從這開始,下面的句子都不是人類可讀形式,當然,相比原版的報錯來說,Forge的報錯非常非常人性化了, 我們可以從第三行看到,這個崩潰報告的描述是Tickingplayer, player代表球員玩家,也就是說這個報錯跟玩家有關系, Tciking指的是刻,這個以后再說, 然后我們再來看下面的報錯 這個報錯片段中, 第一行是錯誤型別 我們可以看到,這個報錯的錯誤型別是 java.lang.IndexOutOfBoundsException 如果你開過Minecraft群組服務器,或者學過java,你可以知道 這個叫做陣列下標越界例外,是一個在Minecraft中非常常見的例外, 我們不用去管這個具體是什么,直接往下看, 下面那些一大堆疊幀的排列,并非沒有順序, 這些堆疊幀的排列方式,是由它們拋出例外的順序決定的, 聽不懂?我們看圖 紅色箭頭指的堆疊幀,是第一個拋出例外的堆疊幀, 然后黃色箭頭的堆疊幀,是最后一個拋出例外的堆疊幀, 現在你懂了堆疊幀的排列順序了吧, 最前面的堆疊幀就是最后一個拋出錯誤的位置,也就是說大多數情況我們是從這里下手, 或者從第一個堆疊幀的后面幾個堆疊幀下手,     好,我們繼續看, 現在我們遇到的是指陣列下標越界例外, 例如:一個ArrayList陣列中沒有元素,而你想獲取第一個元素,運行是就會報此型別的錯誤, 聽不懂?我們看報錯! 看看,最后堆疊幀拋出的例外,就是ArrayList在獲取元素的時候沒找到, 當然你不用在意這個,繼續往下看, 這里已經出現了產生這個崩潰的模組名字, 這個模組叫做:slashblade,也就是大家經常玩的拔刀劍, 然后你發現,這些堆疊幀的形式都是 atxxx.xxxxxxx.xxxxxx.xxxxxxxx.xxxxxxx.xxxxxx(xxxx.java:xxxx) 如果你以壓縮包形式打開拔刀劍模組JAR檔案, 你會發現一件事, 那就是這些堆疊幀其實就是這個JAR壓縮包的內部目錄結構!!!!! 就比如這條堆疊幀 atmods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get(ItemSlashBlade.java:310) 我們可以把所有的".“去掉,改成”/或者\" 這樣就是一個檔案目錄了!! atmods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get(ItemSlashBlade.java:310) 相當于 atmods\flammpfeil\slashblade\item\itemSlashBlade 而這段藍色的,ComboSequence.get,指的是這個堆疊幀中拋出例外的方法,并不是檔案目錄, 括號里的ItemSlashBlade.java:310指的是, 這個例外發生在 ItemSlashBlade.java這個檔案夾中的第310行, 是不是突然明白一大堆東西!!!!!!!!! 下面的圖就是我用壓縮包形式打開拔刀劍模組檔案后, 把堆疊幀轉換成目錄,就找到了拋出例外的檔案路徑, 深度分析 好了,那么我們接下來進行硬核(Hardcore)分析吧 上面我們已經找到了這個崩潰中有拔刀劍的資訊 那么我們就進一步分析, 我們知道,拔刀劍有幾個堆疊幀拋出了例外,那么我們以最后一個拋出例外的堆疊幀進行分析, amods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get 從這段資訊中我們得知,這個拋出例外的方法在ComboSequence.Get中 ComboSequence翻譯過來就是組合技,然后我們進一步分析 既然這個崩潰出在了拔刀劍的組合技上,那也就是說, 我的服務器崩潰是因為,有某個人用了拔刀的組合技,然后不知道觸發了什么BUG,服務器就因此崩潰了, 很好,如果你能分析到這一步,那就快接近真相了! 上代碼 我們首先登陸Github(世界上最大的代碼托管站) 然后找到拔刀劍的開源代碼倉庫,并依次進入目錄 src/main/java/mods/flammpfeil/slashblade/item/ItemSlashBlade.java 然后這個就是拋出例外的原代碼了, 然后搜索方法ComboSequence.get //報錯產生的位置 publicstaticComboSequencegetComboSequence(NBTTagCompoundtag){ returnComboSequence.get(tag.getInt(comboSeqStr)); } 很好,你可能看見一個熟悉的詞匯,叫做NBT 我們參考一段百度百科上的話 二進制命名標簽(NameBinaryTag),NBT格式為Minecraft中用于向檔案中存盤資料的一種存盤格式,NBT格式以樹形結構并配以許多標簽的形式存盤資料 既然如此,我們就可以知道 這個報錯的產生和NBT標簽有關系,然后我們只需要看見tag這個詞即可, 這就代表,這個例外的產生是因為在獲取組合技的NBT資料時產生例外,在結合最后一個拋出的例外 也就是陣列下標越界例外 我們就可以推匯出這個例外的產生了, 一個玩家在使用拔刀的組合技時,然后這個組合技因為某種原因無法使用,也就是ArrayList陣列元素為空,導致拋出陣列下標越界例外,引發Minecraft服務器保護機制然后自動關服,并產生這個報錯,   以及你會發現堆疊幀里有一些例如func_xxxxx_x的奇怪方法名, 這些是混淆后的方法名,如果要深究報錯產生的話,我們就必須反混淆以便知道具體是什么方法造成了這種問題, 這里我推薦使用MinecraftMappings這個專案 這個專案可以在不用下載很多Forge的情況下方便地生成相應的mapping檔案,方便查找混淆后的方法名、欄位等的具體含義, 專案的fork地址在:https://github.com/Mohist-Community/MinecraftMappings 這是GitHub的連接,如果你不會用git等工具的話,只需要按下圖操作走,          點擊Code然后點擊DownloadZIP 然后你還需要一個IDE,最好用IntelliJIDEA的communityedition(社區版)        訪問https://www.jetbrains.com/idea/download/#section=windows然后只需要點擊Download即可, IDEA下載后按引導安裝, 不要怕看不懂英文和嫌麻煩,因為你都走到這一步了,還有什么理由giveup呢? 安裝完畢后啟動IDEA, 然后剛剛把下載完的原始碼包解壓到一個目錄,然后復制原始碼包解壓后的路徑并在IDEA里匯入新工程(ImportProject),路徑就粘貼剛剛你復制的原始碼包解壓后路徑, 然后IDEA會自動匯入這個專案,匯入速度和網速有關系,這不需要不管,如果失敗那就多試幾次或者使用代理加速, 匯入完畢后只需要運行main.kt,就可以自動生成mapping檔案了,在build目錄下, 分別有method、fields、params這3個csv格式的檔案, 可以通過wsp或微軟office系列軟體打開,是表格, 然后直接在里面搜索報錯里出現過的對應func、field等欄位,就可以看到相關說明了, 有必要還可以下載相關forge原始碼查詢,   好了,我們繼續看下面的堆疊幀, 對于下面的堆疊幀來說,上面的堆疊幀全是主要原因,也就是說下面的堆疊幀都是廢話 不過我還是貼出來讓你了解一下, 很好,接下來我們看紅圈內的堆疊幀, 其中所有net.minecraftforge.fml.xxxx的堆疊幀,基本上沒什么有價值的資訊, 我們繼續看下面net.minecraft.xxxx的堆疊幀,我們可以看到關鍵詞匯那就是entity, 得出結論 Entity就是物體的意思,也就是說這個東西出現在玩家使用組合技與物體進行互動時才發生的陣列下標躍境例外 我們繼續看 這2段代表了有關玩家的資訊,意義不大, 我們在這些堆疊幀中可以看到有network和server單詞, 這代表這些堆疊幀與網路和服務端關西了, 這段也是意義不大,而且與拔刀劍產生的報錯無關,我們繼續看, 這段才是好戲,我們可以看到一個詞組叫playerLoggedOut,這個代表玩家登出服務器, 也就是玩家掉線 然后我們結合這些堆疊拋出例外的順序, 我們就可以得知一個大概順序, 玩家使用組合技后,首先從掉線 然后服務端發現例外 然后服務端整理崩潰后就關閉服務器了, 很好,我們對錯誤的分析已經結束了, 接下來我們繼續往下看! 完成看崩潰報告的堆疊幀并得出結論~ 修復報錯 這是下面的內容, 我們可以看到大大的Head(頭部)字樣 然后Thread(執行緒):Serverthread(主執行緒) 我們可以得到一個資訊 那就是說,這些堆疊幀拋出錯誤是在服務器主執行緒上拋出的,所以才會導致服務器自我保護機制開啟并關閉服務器, 我們繼續往下看, 我們可以看見大大的Playerbeingticked 這段代表有關出錯物體的名字, 然后既然出現了Player,代表這個物體是玩家, 也就代表,這個是出錯的物體是玩家,因為那個錯誤拔刀劍在玩家手上,所以出錯物體是玩家, 然后 EntityType是物體型別,EntityID是物體的ID,Name就不用解釋了,是物體名, 因為這個物體是玩家,所以物體名就是玩家名, 如果是一只名為蔡徐坤(cxk)的生物(mobs)物體扔出了籃球,造成了例外,那就是 好了,我們已經知道造成例外的原因、造成例外的玩家了, 那么接下來,就是解決方案拉, 解決方案 好,我們開始解決, 一般來說由物體引起的報錯,我們只需要洗掉這個物體就行了, 這段包含了出錯物體,也就是用了錯誤拔刀劍玩家的位置, 如果這些物體不是玩家,我們可以利用MCEdit、創世神、原版kill指令讓這些物體GG, 可問題在于,這個是玩家,那怎么辦? 我們有2個辦法 第一個是洗掉有關這個玩家的背包資訊, 第二個是打開Forge的錯誤物體自動移除功能, 我們選擇第二個對吧, 我們在服務端的config檔案夾內找forge.cfg然后打開 并找到如下兩行 然后把false改成true并重啟服務器即可, 好了,報錯修復到此結束, 看懂更多 先說一下,這個與解決崩潰沒什么關系了 純粹是為了讓你了解更多的東西, 直接上圖, 我們可以看到, SystemDetails的意思是系統細節 然后下面有 MinecraftVersion游戲版本 OperatingSystem作業系統型號 JavaVersionJava版本 JavaVMVersionJVM版本 Memory記憶體大小 JVMFlagsJVM附加引數等東西 然后還有Plugins里面有你加載到服務器里的插件名字 還有FML代表Forge版本 State和下面的表,是你載入到服務器里的模組和模組的情況 這些英文自己翻譯就行了, 建議平時多積累點詞匯量, 結束 好了,本文到此結束,轉載須注明作者名字和原文地址 本文由Dinnerbone晚餐骨于CSDN上原創發布, 如對你有幫助,或是讓你了解了更多知識,那真是再好不過了,   轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/6747.html 標籤:其他 上一篇:Aery的UE4C++游戲開發之旅(3)藍圖下一篇:UnityRuby'sAdventure第一步 標籤雲 其他(123570)Java(13369)Python(12729)C(7542)區塊鏈(7372)JavaScript(7049)基礎類(6313)AI(6244)腳本語言(PerlPython)(5129)非技術區(4971)Android(4120)MySQL(4012)Linux(3394)C語言(3288)C++語言(3117)Java相關(2746)疑難問題(2699)單片機工控(2479)Web開發(1951)網絡通信(1793)數據庫相關(1767)VB基礎類(1755)PHP(1727)開發(1646)系統維護與使用區(1617).NETCore(1586)基礎和管理(1579)JavaEE(1566)C++(1527)專題技術討論區(1515)Windows客戶端使用(1484)HtmlCss(1466)ASP.NET(1428)Unity3D(1354)VCL組件開發及應用(1353)HTML(CSS)(1220)其他技術討論專區(1200)WindowsServer(1192).NET技术(1165)交換及路由技術(1149)語言基礎算法系統設計(1133)WindowsSDKAPI(1124)界面(1088)JavaSE(1075)Qt(1074)VBA(1048)新手樂園(1016)其他開發語言(947)Go(907)HTML5(901)新技術前沿(898)硬件設計(872)區塊鏈技術(860)網絡編程(857)非技術版(846)一般軟件使用(839)網絡協議與配置(835)Eclipse(790)Spark(750)下載資源懸賞專區(743) 熱門瀏覽 網閘典型架構簡述 網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。

三主機架構分別為內端機、外端機和仲裁機。

三機無論從軟體和硬體上均各自獨立。

首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。

從軟體上來看,三機有各自獨立的作業系統。

這樣能達到完全的三機獨立。

對于“2+1”系統,“2”分為...... uj5u.com2020-09-1002:00:44more 如何從xshell上傳檔案到centoslinux虛擬機里 如何從xshell上傳檔案到centoslinux虛擬機里及:虛擬機CentOs下執行yum-yinstalllrzsz命令,出現錯誤:鏡像無法找到軟體包前言一、安裝lrzsz步驟二、上傳檔案三、遇到的問題及解決方案總結前言提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具...... uj5u.com2020-09-1002:00:47more 一、SQLMAP入門 一、SQLMAP入門1、判斷是否存在注入sqlmap.py-u網址/id=1id=1不可缺少。

當注入點后面的引數大于兩個時。

需要加雙引號,sqlmap.py-u"網址/id=1&uid=1"2、判斷文本中的請求是否存在注入從文本中加載http請求,SQLMAP可以從一個文本檔案中...... uj5u.com2020-09-1002:00:50more Metasploit簡單使用教程 metasploit簡單使用教程浩先生, 2020-08-2816:18:25分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全編輯 著作權metasploit使用教程前言一、Metasploit是什么?二、準備作業三、具體步驟前言Msfconsole...... uj5u.com2020-09-1002:00:53more 游戲逆向之驅動層與用戶層通訊 驅動層代碼:#pragmaonce#include#defineadd_codeCTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)/*更多游戲逆向視頻www.yxfzedu.com...... uj5u.com2020-09-1002:00:56more 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準北斗電力時鐘(北斗授時服務器)讓網路資料更精準京準電子科技官微——ahjzsz近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。

計算機網路資訊在電力系統中的應用,一方面使電力系統的運行...... uj5u.com2020-09-1002:01:03more 【CTF】CTFHub技能樹彩蛋writeup ?碎碎念CTFHub:https://www.ctfhub.com/筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。

感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。

而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。

個人還是非常喜歡這個...... uj5u.com2020-09-1002:04:05more 02windows基礎操作 我學到了一下幾點Windows系統目錄結構與滲透的作用常見Windows的服務詳解Windows埠詳解常用的Windows注冊表詳解hackerDOS命令詳解(netuser/type/md/rd/dir/cd/netusecopy、批處理等)利用dos命令制作...... uj5u.com2020-09-1002:04:18more 03.Linux基礎操作 我學到了以下幾點01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP01LINUXwindows:win038121619配置不繁瑣Linux:redhat,centos(紅帽社區版),Ubuntuserver,suseunix:金融機構,證券,銀...... uj5u.com2020-09-1002:04:30more 05HTML 01HTML介紹02頭部標簽講解03基礎標簽講解04表單標簽講解HTML前段語言js1.了解代碼2.根據代碼懂得挖掘漏洞(POST注入/XSS漏洞上傳)3.黑帽seo白帽seo客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單TDK標題,描述...... uj5u.com2020-09-1002:04:36more 最新发布 Scala將案例類串列轉換為另一個案例類串列 caseclassstudent1(name:String,marks:Long)caseclassstudent2(studentName:String,marks:Long)valmylist:List[student1]=List(student1("a",100),student... uj5u.com2021-10-1616:17:44more 具有不同泛型型別的Scala3擴展多載 我正在從Scala2.13遷移到Scala3,并且正在嘗試重寫小型實用程式函式。<br><br>在2.13中,可以撰寫一個更通用的隱式和另一個更具體的,但在Scala3中似乎不再可能。<br><br>typeOutcom... uj5u.com2021-10-1616:16:46more CatsScala中的序列和遍歷以映射型別 我有一個型別的值,List[EitherT[IO,String,Int]]我想對其進行序列處理以將其映射到EitherT[IO,String,List[Int]]我閱讀并找到了序列方法,但它給了我一個錯誤,說它需要[G]... uj5u.com2021-10-1616:14:44more 為什么集合上的`contains`不需要正確的型別? 這是怎么編譯的:scala>valx:Vector[Int]=Vector(1,2,3)valx:Vector[Int]=Vector(1,2,3)scala>x.contains("hello")valres4:Boolean=falsescala>x.contains(... uj5u.com2021-10-1616:14:15more 在Scala中將兩個不同的RDD與不同的鍵組合在一起 我有兩個文本檔案已經由sparkcontext創建為rdd。<br><br>其中一個(rdd1)保存相關詞:apple,applescar,carscomputer,computers另一個(rdd2)保存專案數:(apple,12)(apples,50)(car,5)(ca... uj5u.com2021-10-1616:13:46more 將錯誤從catch塊記錄到Cosmosdb-spark 目標:-使用“get”api呼叫從S3存盤桶中檢索物件,將檢索到的物件寫入azure資料湖,并在出現404s(未找到物件)等錯誤時將錯誤訊息寫入CosmosDB“my_dataframe”由一列(s3O... uj5u.com2021-10-1616:13:14more 如何處理用于理解和錯誤恢復的錯誤場景 目前我的錯誤處理沒有按照我的意愿作業,這就是我想要做的:UserApi.insert失敗,回傳錯誤,不要繼續WorkApi.insert失敗,呼叫UserApi.delete后回傳錯誤WorkApi.assign失敗,呼叫... uj5u.com2021-10-1616:12:45more 如何發送多條訊息作為我的來源 我只是在嘗試這個當前有一個TextMessage作為源的示例流://printeachincomingstricttextmessagevalprintSink:Sink[Message,Future[Done]]=Sink.forea... uj5u.com2021-10-1616:12:12more 如何在寫入時強制資料集匹配其架構? 經過一些轉換后,我想使用insertInto將spark資料集保存到鑲木地板表中。<br><br>ds.write.mode(SaveMode.Overwrite).insertInto(tablename)但是操作失敗,給我這個錯誤:[TABLENAME]... uj5u.com2021-10-1616:11:31more 用于理解的模式匹配分配如何轉化為一元操作? 我熟悉的概念,即Scala的for內涵是對一元的操作只是語法糖(map,withFilter,foreach和flatMap)和脫糖中描述這個流行的答案。<br><br>通過這種邏輯,我驚訝地發現,當使用模式匹配作為推導式的... uj5u.com2021-10-1616:10:58more 友情鏈接 有解無憂



請為這篇文章評分?